Начало обработки PHP в фоновом режиме - PullRequest
2 голосов
/ 27 октября 2011

Я работаю над PHP-сайтом и перенесу его на новый сервер. Новый сервер, на который я переезжаю, не поддерживает CRON. Чтобы компенсировать это, я разработал систему, использующую форматы времени и таблицы базы данных и многое другое для запуска своего кода.

У меня проблема с этим битом кода:

if ($lasttime < $pretime)
{
    $newtime = strtotime("now");

    queryMysql("UPDATE time SET time=".$newtime." WHERE time=".$lasttime);

    include_once 'grabber/grabber.php';
}

В частности, именно include_once 'grabber/grabber.php'; вызывает проблему. Когда таймер срабатывает и этот код запускается, он попадает во включаемый файл, а затем код останавливается без предоставленной ошибки, поэтому включение не выполняется. Я попытался изменить его на exec(), но, если честно, я не до конца понимаю, как работает exec() и правильно ли это делать. Вот как я это использовал:

if ($lasttime < $pretime)
{
    $newtime = strtotime("now");

    queryMysql("UPDATE time SET time=".$newtime." WHERE time=".$lasttime);

    $grabber = $base."grabber/grabber.php";    

    exec($grabber);
}

Это не останавливает код и кажется, что он работает, но на самом деле он не работает, если grabber/grabber.php работает правильно, я получаю электронное письмо для подтверждения с использованием функции PHP mail()

Если бы кто-нибудь мог помочь мне решить это или пролить свет, который был бы блестящим. Спасибо.

Ответы [ 2 ]

1 голос
/ 27 октября 2011

Скорее всего, это проблема с расположением файла или разрешениями.Должна быть какая-то ошибка, или код не останавливается, но вы не проверяете это должным образом, или есть какая-то проблема с кодом в самом grabber.php.Добавьте несколько строк отладки - напечатайте имя файла, чтобы вы могли проверить ошибки в пути / имени;добавьте error_reporting(E_ALL); ini_set('display_errors', true); где-нибудь выше строки include_once;убедитесь, что файл находится там, где вы пытаетесь его открыть, учитывая относительные пути и т. д. Убедитесь, что у вас есть разрешения на запуск этого файла.

exec () - это не то, что вам нужно в этом случае, по крайней мере, не так, как вы пытаетесь его использовать.

Если это не поможет - дайте больше информациио том, как вы запускаете сценарии, которые вы показали, что находится в файле grabber.php, какие ошибки вы получаете и т.д.

1 голос
/ 27 октября 2011

(при условии, что ваш сервер * nix). Если вы хотите использовать exec(), вам нужно поместить hashbang в верхней части скрипта, который указывает на исполняемый файл PHP и дать ему разрешения на выполнение. 1004 *

Или (это, вероятно, лучший / более переносимый подход), измените

$grabber = $base."grabber/grabber.php";    
exec($grabber);

до

$grabber = "php ".$base."grabber/grabber.php";    
exec($grabber);

... как будто вы запускаете его с терминала.

Однако я сомневаюсь, что это решит проблему - я думаю, что ответ, скорее всего, будет одним из следующих:

  • Ошибка разбора в grabber.php. Имейте в виду, что между основными версиями PHP есть небольшие синтаксические различия - если ваша версия PHP отличается на ваших старых / новых хостах, это может быть проблемой.
  • Вызов функции, которая была определена на вашем старом хосте, но не на новом, из-за разницы в версии PHP или установленных расширениях
  • grabber.php был поврежден при перемещении между серверами

Попробуйте с include_once, но сделайте ini_set('display_errors',1); error_reporting(-1);, чтобы убедиться, что вы действительно видите какие-либо ошибки. Как вы называете основной сценарий? Как вы увидите ошибки? Отредактируйте вопрос с помощью этой информации, любой код из grabber.php, который, по вашему мнению, может быть релевантным, и я расширю этот ответ.

...