2013-04-30 2 views
3

Я борюсь с получением файла php для работы в фоновом режиме с помощью exec() PHP. В качестве первого теста я попытался:Exec для запуска php в качестве фонового процесса

exec("ls -l > logfile.txt 2> errfile.txt &"); 

Это прекрасно работает. Файл logfile.txt заполняется списком каталогов.

В соответствии с инструкциями в документации по php, поскольку exec запускает процесс, выполняющийся в фоновом режиме, стандартная (и стандартная ошибка) перенаправляется в файл.

Теперь я стараюсь

exec("/usr/bin/php -f /path/to/my.php > logfile.txt 2> errorfile.txt &"); 

Оказывается ничего не происходит.

Вот тестовые файлы, которые я пытаюсь:

alpha.php

<?php 
    $version="a"; 
    // Go do something we do not need to wait for. 
    exec("/usr/bin/php -f /path/to/beta.php > logfile.txt 2> errorfile.txt &"); 
?> 

<html> 
    <head><title>Test</title></head> 
    <body> 
    <p>This is Alpha version <?php echo $version; ?></p> 
    </body> 
</html> 

beta.php

<?php 
    if (!($fp = fopen('/home/johnst12/public_html/workshops/admin/betadata.txt', 'w'))) { exit;} 
    fprintf($fp, "Proof that Beta executed."); 
    fclose($fp); 
?> 

Если я бегу beta.php напрямую, он отлично работает. Сообщение Betadata.txt получает сообщение.

Если я запустил alpha.php для запуска beta.php, файл betadata.txt не будет создан. logfile.txt и errorfile.txt остаются пустыми (ожидается).

Я уверен, что путь к php и путь к моему файлу php верны.

Гуглинг для уточнения не был плодотворным. Несколько общих тем кажутся (а) нехваткой ресурсов? (б) отсутствие разрешения на целевой файл php? Из ресурсов кажется маловероятным. Разрешение на скрипт глобально читается 644 (rw-r - r--). Я попытался добавить execute (755) на всякий случай, если это поможет. Это не имело значения.

PHP версия 5.3.21 Система Linux/Apache. safe_mode Выкл.

Что мне не хватает? Благодарю.

+0

У пользователя есть разрешение на запись в папку с этим пользователем. Попробуйте запустить whoami и на сервере su - «theuser» и коснитесь файла – Lefsler

ответ

0

Прежде всего: Вы подтвердили, что/usr/bin/php - правильный путь к PHP?

Php не любит работать так. Что-то связанное с stdin. Попробуйте с поЬирами:

exec("nohup /usr/bin/php -f /path/to/beta.php > logfile.txt 2> errorfile.txt &"); 

С -f что-нибудь еще, что выглядит как флаг будет идти на PHP, так что если вы хотите, чтобы передать опцию «-x» в ваш сценарий, то вам придется

/usr/bin/php -f /path/to/beta.php -- -x 

Без параметров перед тем, как имя файла перейдет на PHP и после перехода к скрипту.

/usr/bin/php /path/to/beta.php -x 

Предполагаете, вы уже просмотрели два файла в случае, если они имеют выход или ошибки?

Несколько других вещей, чтобы проверить:

Удалить два файла.Они воссоздаются каждый раз, когда этот код работает?

exec("nohup /usr/bin/php -v > logfile.txt &"); 

должен выводить информацию о версии в этот файл журнала.

exec("/usr/bin/php -f /path/to/beta.php > logfile.txt 2> errorfile.txt"); 

должен правильно запустить сценарий (но не в фоновом режиме).

Смежные вопросы