Запустить длинный php-скрипт через Cronjob

поэтому у меня есть php-скрипт, который требует данные с удаленного сервера. Это выглядит так:

set_time_limit(100);
ignore_user_abort(true);

$x = 0
while($x < 10){
    $data = file_get_contents("http://www.remoteserver.com/script");
    // do something with the data
}

// insert ALL the gained data in the local database

Если я открою скрипт в своем браузере, это займет около 10 секунд. Однако мне нужно зациклить не 10 раз, а 24 раза. Затем сценарий занимает около 22 секунд. Я не могу вставить данные в цикл, мне нужно дождаться завершения цикла.

Теперь интересная часть заключается в том, что когда цикл установлен на 10, скрипт может завершиться, если он запускается через cronjob. Если установлено значение 24, скрипт не успевает завершиться и данные в локальную базу данных не вставляются!

Почему это? Есть ли решение моей проблемы? Он отлично работает, когда я открываю его в своем браузере.

Я вызываю скрипт с помощью этой команды cronjob:

php public_html/example.com/my_script.php

Я получаю те же результаты с этой командой cronjob:

curl "http://example.com/my_script.php"

person Jonas Kaufmann    schedule 03.07.2013    source источник
comment
Может быть, вы достигли предела памяти? Вы получаете какие-либо ошибки обратно?   -  person complex857    schedule 04.07.2013


Ответы (2)


Чтобы запустить без тайм-аута, set_time_limit(0).

Чтобы запустить, не дожидаясь результатов, подключите скрипт.. php -f /path/to/file 2>&1

person Rob W    schedule 03.07.2013

У меня была аналогичная проблема (проблемы параллелизма). У вас также может быть это, если ваш скрипт требует больше времени для выполнения, чем период, в течение которого cron его вызывает. Попробуйте заблокировать файл, например:

$fp = fopen(dirname(__FILE__), 'r'); 
if (flock($fp, LOCK_EX | LOCK_NB)) // lock yourself
{
    ...do your thing...
    flock($fp, LOCK_UN); // unlock yourself
}
fclose($fp);
person ikonic    schedule 03.07.2013