вопрос: функция exec или system запускает файл и ждёт пока он полностью не выполнится. есть ли функция, которая не будет ждать выполнения и позволит продолжить работу?
Запускать файл - это сильно... Запускай с помощью нее, но - с отвязкой от консоли (хотя, конечно, в PHP происходящее сложно назвать консолью), то есть - с амперсандом ( & ) после команды.
запустил с амперсандом по-прежнему ждёт выполнения файла и не продолжает работу скрипта exec('php d:/dev.php &');
ОМФГ. Ну откуда мне знатЬ, что ты под Виндой сидишь. Резонный вопрос - у тебя и так исполняется php код. Зачем из php кода вызывать исполнение php кода - не проще ли вставить? Хотя, тебе, судя по всему - потоков в php не хватает, читай про реализации псевдомногопоточности, по слухам оч клевых вещей люди на основе оной добиваются.
Неймлесс прав, в винде нормально не демонизируешь скрипт и не оторвёшься от консоли... Если нужна многопоточность вот тут есть интересная её реализация, правда крайне экспериментальная... http://github.com/danhen/php_threads/tree/master
многопоточность в ПХП мне не нужна. мне нужно 2 параллельно работающих скрипта в многопоточной операционной системе. т.е. 2 раза запустить php.exe с параметром. но не вручную а с помощью кода на пхп если невозможно - очень жаль, я в унынии(
Обработка файла размером 300Мб с занесением в БД 4,915,500 записей заняло 377секунд. Неплохой результат, учитывая то, что размер порции не слишком большой. Здесь есть риск вызвать Fatal Error выделения памяти при больших порциях. Я думаю, для подобных операций, которые, я думаю, выполняются нечасто, такой подход вполне приемлим.
ss88, Naydav Омг, что за ужос вы пишете в час ночи?) Для больших файлов Бог давно придумал fgets и stream_get_line. fgets для построчного чтения, стрим - для любого разделителя PHP: <pre><?php $startTime=microtime(true); set_time_limit(0); $ss=0; $hFile=fopen("dump2.txt","r"); $fileSize=filesize("dump2.txt"); echo "<b>Размер исходного файла:</b> ".($fileSize/1048576)."Mb<br/>"; while($buf=fgets($hFile,4096)) //while($buf=stream_get_line($hFile,4096,"*")) { $tmp=$buf; $ss++; } fclose($hFile); echo "Предпоследняя строка: ".$tmp."\r\n".'Количество прочитанных строк '.$ss."\r\n"; echo "<br/><b>Время затраченное на операцию: </b>".(microtime(true)-$startTime)." seconds"; ?>
изменил кое-что, но твой вариант со взятием каждой строки отдельно - это для больших файлов, конечно, самое оно, я не подумавши только что запустил такой вариант, уже минут 10 чиргыкает 100Мб... Но кое-что я таки поменял, за что тебе спасиобо PHP: <?php $startTime=microtime(TRUE);//приблизительный замер времени начала $db=mysql_connect("localhost","root",""); mysql_select_db("achat",$db); //убираем лимит по времени и аборты от пользователя set_time_limit(0); ignore_user_abort(TRUE); $currPos=0;//текущая позиция в байтах $delimiter='*'; $hFile=fopen("dump.txt","rt"); $partSize=51200;//одна порция = 50Кб $currPos=0;//текущая позиция в байтах, считая от начала файла $fileSize=filesize("dump.txt");//размер файла echo "<b>Размер исходного файла:</b> ".($fileSize/1048576)."Mb ({$fileSize}Bytes)<br/>"; //дочитыване до конца последней строки while(!feof($hFile)) {//если осталось в файле меньше,чем на порцию if($currPos+$partSize>$fileSize) $partSize=$fileSize-$currPos; //считывание порции определенного размера $currentPartOfData=fread($hFile,$partSize); $currPos+=$partSize; /* если последний символ не разделитель строк, то нужно дочитать порцию до разделителя*/ if($currentPartOfData{strlen($currentPartOfData)-1}!=$delimiter) { $currentPartOfData.=$tmp=stream_get_line($hFile,$partSize,$delimiter); $currPos+=strlen($tmp)-1; } /*НАГРУЗКА - разбить порцию на массив*/ $currentPartOfData=explode($delimiter,$currentPartOfData); /*занесение значений в базу данных*/ foreach ($currentPartOfData as $string) mysql_query("INSERT INTO gruz (str) VALUES('{$string}');",$db); echo "#"; } echo $currentPartOfData[count($currentPartOfData)-1]."<br/>"; fclose($hFile); mysql_close($db); echo "<br/>endPos={$currPos}<br/><b>Время затраченное на операцию: </b>".(microtime(TRUE)-$startTime)." seconds"; ?> кстати, теперь, когда окончание строки выдирается stream_get_line работает с такой же скоростью. А вот все таки вариант с построчным выдиранием - это не то ))) запусти такое у себя, когда файл из строк символов по 200-300, а сам файл метров 100-200, мне пришлось рестартить апач, чтобы эта медленная садистская вакханалия прекратилась. ))) Вобщем-то, закономерно, что, при уменьшении размера порции, увеличится время выполнения, но и нужно задуматься перед тем, как ставить ее больше одного Мб. Хотя наибольшего быстродействия чтение/разбиение я добился при размере порции 50Кб. 20Мб без занесения в БД обрабатывается 0,2с. Так что, уже стало ясно, по крайней мере мне, что при средних размерав дампов в 40-100Мб, операция их чтения/обработки/занесения в БД совсем даже и не критичны в таком контексте выполнения.
мааленький вопрос. :-[ есть хеши с "мусором" вида 2008-08-18(43):3557d8eff41195a6e33efb18d356a3e5:::0 нужен только хеш PHP: <?php $op="filet.xt"; $file=file_get_contents($op) or die ("Cannot open file"); $exp=explode(":",$file); echo $exp[1]; ?> запутался с циклом =\ и вообще оптимален ли такой вариант? или есть лучше
если размер файла превысит допустимые размеры на выделение памяти для переменных, то получишь Fatal error: Allowed memory size of хххххх bytes exhausted (tried to allocate ххххх bytes)
#Wolf#, PHP: <?php $str = '2008-08-18(43):3557d8eff41195a6e33efb18d356a3e5::'; preg_match('#[0-9a-f]{32}#i',$str, $matches); print_r($matches); echo $matches[0]; ?> Это вопрос по части регулярок, задаються сюда) http://forum.antichat.ru/thread92492.html
Как из TEXTAREA все данные перекинуть массив (условие что каждый новый элемент с "\n"); Т.е. Есть TEXTAREA: Первый Второй Должно быть $mas[0]=Первый $mas[1]=Второй. Пробую так: ==========бла бла бла========== <TEXTAREA name=all cols=45 rows=15></TEXTAREA><br> ==========бла бла бла========== $array=array(split("\n",$_POST['all'])); ==========бла бла бла==========
Может мой вопрос не сильно по теме,но как можно имитировать POST в ссылке,вопше делают так например http://blablabla.ru/index.php&post=on ето передается как бы в POST запросе переменная post со значением on вот только далекооо не всегда так выходит...подскажите плз...
форму свою делаешь локальную на сайте с автосабмитом и даешь ссылку на неё тому, кому надо (хоть себе)
Дык,насчет автосабмита я нашел только 1н скрипт,и он тупой не нажимает на клавишу а лишь через заданое время делает клавишу со ссылкой которая подана в POST запросе и на нее уже жмет,тупость короче,дай тогда норм етот скрипт,да и вопше,я в основе задал другой вопрос,как конкретно впихнуть ето в ссылку,ну и етот скрипт не помешает))