Использование exec() в PHP: передача аргументов

В целях тестирования предположим, что input.PHP выглядит так

<?php
{
$TO = "[email protected]";
$FROM = "[email protected]";
$SUB = "Yadda";
$BODY = "This is a test";
exec("/usr/bin/php /xxx.yyy.net/TESTS/sendit.PHP $TO $SUB $BODY $FROM > /dev/null &");
echo "DONE";
}
?>

И sendit.PHP, который вызывается exec(), выглядит так:

<?php
$to      = $argv[1];
$subject = $argv[2];
$message = $argv[3];
$headers = 'From: '.$argv[4]. "\r\n" .
'Reply-To: '.$argv[4]. "\r\n" .
'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);
?>

Когда я открываю input.PHP в своем браузере, я получаю сообщение echo DONE, но тестовое письмо не отправляется. Что не так с моим кодом? Благодарю вас.


person johnwhitney    schedule 01.08.2011    source источник
comment
1) Если вы выводите что-то в sendit.PHP и помещаете свой вывод в файл, он там? 2) Почему вы делаете exec? Почему бы просто не вызвать sendit.PHP напрямую?   -  person afuzzyllama    schedule 02.08.2011
comment
попробуйте записать в файл вместо /dev/null, так как это подавит любые ошибки (фактически весь вывод) в черную дыру, запись в файл даст вам больше информации. Затем опубликуйте то, что файл говорит здесь.   -  person Travis Pessetto    schedule 02.08.2011


Ответы (2)


Без информации об ошибке я не уверен, что это вся проблема, но я бы начал с этого:

Аргументы, прочитанные $argv, разделены пробелами. Следующий код:

 /usr/bin/php /xxx.yyy.net/TESTS/sendit.PHP $TO $SUB $BODY $FROM > /dev/null &

в вашем примере выполняется следующим образом:

 /usr/bin/php /xxx.yyy.net/TESTS/sendit.PHP [email protected] Yadda This is a test [email protected] > /dev/null &

Получается $argv[3] == 'This' и $argv[4] == 'is'.

person Chris Hepner    schedule 01.08.2011
comment
я думаю это может быть оно. Интересно, что он находит. Также обратите внимание на @Johnwhitney, не забудьте экранировать символы. Итак, когда у вас есть "Yadda This \"is\" a test" и т. д. - person Luke; 02.08.2011

Без какой-либо отладки я не думаю, что кто-то сможет дать вам ответ.

Вы должны помнить, что *nix чувствителен к регистру. Таким образом, вы должны убедиться, что /xxx.yyy.net/TESTS и т. д. действительно указаны в правильном регистре и правильно написаны.

Также я бы посоветовал не отправлять все в /dev/null и, возможно, в файл. Просто потому, что /usr/bin/php мог использовать другую конфигурацию (со мной это случалось раньше), и она не работала должным образом, когда я запускал скрипты в crontab.

Вам нужно узнать больше информации! Проверьте журналы php, посмотрите, что дает вам этот скрипт, когда вы запускаете его из терминала.

person Luke    schedule 01.08.2011
comment
Что мне нужно добавить для записи в файл? У меня правильные пути. - person johnwhitney; 02.08.2011
comment
@joshwhitney Вместо того, чтобы делать /xxx.yyy.net/TESTS/sendit.PHP $TO $SUB $BODY $FROM > /dev/null, вы, вероятно, можете сделать что-то вроде /xxx.yyy.net/TESTS/sendit.PHP $TO $SUB $BODY $FROM 2>&1 /var/log/php_emailer.log, чтобы он перенаправлял вывод в файл в /var/log/php_emailer.log - person Luke; 02.08.2011
comment
@johnwhitney, когда вы запускаете свою команду из командной строки, она работает? вы получаете по электронной почте? - person Luke; 02.08.2011
comment
У меня был неправильный патч для PHP. На моем хосте они требуют /usr/local/bin/php. Теперь код работает. - person johnwhitney; 02.08.2011