2009-11-21 193 views
2

Так что я пытаюсь выполнить какой-то скрипт из моего php-кода. Это живет в странице blah.phpЗапустить и забыть системный вызов в php

<?php 
    // .... 
    // just basic web site that allows upload of file... 
?> 

Внутри я использую системный вызов

if (system("blah.pl arg1") != 0) 
{ 
    print "error\n"; 
} 
else 
{ 
    print "working on it..you will receive e-mail at completion\n"; 
} 

прекрасно работает, но он ждет, пока она не завершится, пока он не печатает работы на нем. Мне известно, что я вызываю скрипт perl из php, а не опечатку.

Как я могу начать выполнение программы и завершить ее в фоновом режиме. Сценарий blah.pl обрабатывает уведомление по электронной почте.

Кто-нибудь?

Спасибо Я ценю это

ответ

10

С system функции документации:

Примечание: Если программа запускается с помощью этой функции, для того, чтобы продолжать работать в фоновом режиме, то вывод программы должен быть перенаправлен в файл или другой выходной поток. В противном случае PHP зависнет до завершения программы.

Просто перенаправляйте вывод своего скрипта Perl, и PHP должен работать, не дожидаясь завершения сценария.

system("blah.pl arg1 > /dev/null 2>&1 &"); 
2

Вы можете добавить амперсанд на нерест процесс в фоновом режиме?

if (system("blah.pl arg1 &") != 0) 
-1

Поскольку все функции командной строки PHP ждут результата - я рекомендую вам иметь отдельную страницу для вызова сценария электронной почты.

Другими словами, отправьте запрос на страницу email.php (или что-то еще) с помощью cURL или оберток файлов, который позволяет закрыть соединение до получения результата. Таким образом, процесс будет выглядеть примерно так.

 page_running.php 
     | 
    cURL call to (email.php?arg1=0) 
     |   | 
final output  email.php 
        | 
        calls system("blah.pl arg1") 
+1

Это будет работать, но не имеет преимущества перед перенаправлением вывода исходного вызова и будет использовать больше ресурсов. –

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