[php] Новичкам: задаем вопросы

Discussion in 'PHP' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. imajo.ati

    imajo.ati Banned

    Joined:
    21 Feb 2008
    Messages:
    232
    Likes Received:
    62
    Reputations:
    8
    вопрос:
    функция exec или system запускает файл и ждёт пока он полностью не выполнится.
    есть ли функция, которая не будет ждать выполнения и позволит продолжить работу?
     
  2. Namelles One

    Namelles One Elder - Старейшина

    Joined:
    8 Jul 2005
    Messages:
    43
    Likes Received:
    14
    Reputations:
    19
    Запускать файл - это сильно...

    Запускай с помощью нее, но - с отвязкой от консоли (хотя, конечно, в PHP происходящее сложно назвать консолью), то есть - с амперсандом ( & ) после команды.
     
    2 people like this.
  3. imajo.ati

    imajo.ati Banned

    Joined:
    21 Feb 2008
    Messages:
    232
    Likes Received:
    62
    Reputations:
    8
    запустил с амперсандом

    по-прежнему ждёт выполнения файла и не продолжает работу скрипта

    exec('php d:/dev.php &');
     
  4. oRb

    oRb Elder - Старейшина

    Joined:
    9 May 2008
    Messages:
    294
    Likes Received:
    582
    Reputations:
    256
    Так это винда, а не линукс. Здесь такое не прокатит.
     
    1 person likes this.
  5. Namelles One

    Namelles One Elder - Старейшина

    Joined:
    8 Jul 2005
    Messages:
    43
    Likes Received:
    14
    Reputations:
    19
    ОМФГ.

    Ну откуда мне знатЬ, что ты под Виндой сидишь.

    Резонный вопрос - у тебя и так исполняется php код. Зачем из php кода вызывать исполнение php кода - не проще ли вставить? Хотя, тебе, судя по всему - потоков в php не хватает, читай про реализации псевдомногопоточности, по слухам оч клевых вещей люди на основе оной добиваются.
     
  6. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Неймлесс прав, в винде нормально не демонизируешь скрипт и не оторвёшься от консоли... Если нужна многопоточность вот тут есть интересная её реализация, правда крайне экспериментальная...

    http://github.com/danhen/php_threads/tree/master
     
    1 person likes this.
  7. imajo.ati

    imajo.ati Banned

    Joined:
    21 Feb 2008
    Messages:
    232
    Likes Received:
    62
    Reputations:
    8
    многопоточность в ПХП мне не нужна.
    мне нужно 2 параллельно работающих скрипта в многопоточной операционной системе.

    т.е. 2 раза запустить php.exe с параметром. но не вручную а с помощью кода на пхп

    если невозможно - очень жаль, я в унынии(
     
    #6907 imajo.ati, 19 Dec 2008
    Last edited: 19 Dec 2008
  8. ss88

    ss88 Banned

    Joined:
    27 Nov 2008
    Messages:
    160
    Likes Received:
    44
    Reputations:
    5
    Обработка файла размером 300Мб с занесением в БД 4,915,500 записей заняло 377секунд. Неплохой результат, учитывая то, что размер порции не слишком большой. Здесь есть риск вызвать Fatal Error выделения памяти при больших порциях.
    Я думаю, для подобных операций, которые, я думаю, выполняются нечасто, такой подход вполне приемлим.
     
  9. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    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";
    ?> 
     
    _________________________
    1 person likes this.
  10. ss88

    ss88 Banned

    Joined:
    27 Nov 2008
    Messages:
    160
    Likes Received:
    44
    Reputations:
    5
    изменил кое-что, но твой вариант со взятием каждой строки отдельно - это для больших файлов, конечно, самое оно, я не подумавши только что запустил такой вариант, уже минут 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Мб, операция их чтения/обработки/занесения в БД совсем даже и не критичны в таком контексте выполнения.
     
    #6910 ss88, 19 Dec 2008
    Last edited: 19 Dec 2008
  11. #Wolf#

    #Wolf# Elder - Старейшина

    Joined:
    26 Mar 2008
    Messages:
    375
    Likes Received:
    166
    Reputations:
    16
    мааленький вопрос. :-[
    есть хеши с "мусором" вида 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];
    ?>
    запутался с циклом =\
    и вообще оптимален ли такой вариант? или есть лучше
     
  12. ss88

    ss88 Banned

    Joined:
    27 Nov 2008
    Messages:
    160
    Likes Received:
    44
    Reputations:
    5
    если размер файла превысит допустимые размеры на выделение памяти для переменных, то получишь
    Fatal error: Allowed memory size of хххххх bytes exhausted (tried to allocate ххххх bytes)
     
  13. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    #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
     
    #6913 b3, 19 Dec 2008
    Last edited: 19 Dec 2008
    1 person likes this.
  14. $p01nt

    $p01nt Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    116
    Likes Received:
    20
    Reputations:
    1
    Как из TEXTAREA все данные перекинуть массив (условие что каждый новый элемент с "\n");

    Т.е. Есть TEXTAREA:
    Первый
    Второй
    Должно быть
    $mas[0]=Первый
    $mas[1]=Второй.

    Пробую так:
    ==========бла бла бла==========
    <TEXTAREA name=all cols=45 rows=15></TEXTAREA><br>
    ==========бла бла бла==========
    $array=array(split("\n",$_POST['all']));
    ==========бла бла бла==========
     
  15. GreenBear

    GreenBear наркоман с медалью

    Joined:
    7 May 2005
    Messages:
    2,547
    Likes Received:
    1,398
    Reputations:
    612
    $array = explode("\n", $_POST['all']);
     
  16. MaTpOc

    MaTpOc Elder - Старейшина

    Joined:
    5 May 2008
    Messages:
    633
    Likes Received:
    475
    Reputations:
    25
    Где можно скачать норм учебник по пхп с 0, так чтоб без лишнего и одним архивом?
     
  17. life_is_shit

    life_is_shit Elder - Старейшина

    Joined:
    21 Aug 2007
    Messages:
    300
    Likes Received:
    149
    Reputations:
    19
    http://www.php.net/download-docs.php
    удачи=)
     
  18. Mixon

    Mixon Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    Может мой вопрос не сильно по теме,но как можно имитировать POST в ссылке,вопше делают так например

    http://blablabla.ru/index.php&post=on

    ето передается как бы в POST запросе переменная post со значением on вот только далекооо не всегда так выходит...подскажите плз...
     
  19. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    форму свою делаешь локальную на сайте с автосабмитом и даешь ссылку на неё тому, кому надо (хоть себе):)
     
    #6919 Pashkela, 19 Dec 2008
    Last edited: 19 Dec 2008
  20. Mixon

    Mixon Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    Дык,насчет автосабмита я нашел только 1н скрипт,и он тупой не нажимает на клавишу а лишь через заданое время делает клавишу со ссылкой которая подана в POST запросе и на нее уже жмет,тупость короче,дай тогда норм етот скрипт,да и вопше,я в основе задал другой вопрос,как конкретно впихнуть ето в ссылку,ну и етот скрипт не помешает))
     
Thread Status:
Not open for further replies.