PHP скрипт не может записать в файл с почтовым каналом - PullRequest
1 голос
/ 07 ноября 2011

У меня есть простой скрипт, написанный для обработки полученного письма.Вот проверенные сценарии:

A.Функция сценария заключается в отправке электронного письма, указывающего, что электронное письмо было получено по указанному адресу.

- проверено браузером - Успех

- проверено CLI - Успех

- проверено трубопроводом- Успех

Б.Функция сценария состоит в том, чтобы анализировать и записывать файлы в папку, И отправлять электронную почту, указывая, что электронная почта была получена по адресу

- проверено браузером - Файлы записаны и отправлено электронное письмо.

- проверено CLI - Файлынаписано и отправлено по электронной почте.

- проверено с помощью трубопровода - файлы НЕ записаны, НО электронное письмо отправлено.

Я упростил скрипт до базовой функции чтения и записи переданного сообщения.Я подозреваю, что проблема связана с разрешением, но я не могу найти никаких подтверждающих доказательств.

Я не владею CLI, но могу выполнить некоторую задачу.Я не уверен, где искать файлы журналов для конвейерного сценария.

Трубопровод прекрасно работает во всех протестированных сценариях.Вот упрощенный код, который не выполняется при вызове по трубопроводу:

#!/usr/bin/php -q
<?php
/* Read the message from STDIN */
$fd = fopen("php://stdin", "r"); 
$email = ""; // This will be the variable holding the data.
while (!feof($fd)) {
$email .= fread($fd, 1024);
}
fclose($fd);
/* Saves the data into a file */
$fdw = fopen("/my/folder/mail.txt", "w");
fwrite($fdw, $email);
fclose($fdw);
/* Script End */

Спасибо за любую помощь.

Изменен код:

#!/usr/bin/php -q
<?php
/* Read the message from STDIN */
$email = file_get_contents('php://stdin');

/* Saves the data into a file */
$fdw = fopen("/Volumes/Cobra/Sites/email/mail.txt", "w+");
if (! $fdw) {
    error_log("Unable to open mail.txt for output.", 1, "myemail@mydomain.com", "From: admin@mydomain.com");
} else {
    fwrite($fdw, $email);
}

fclose($fdw);

/* Script End */

Сообщение об ошибке было отправлено по электронной почте.Что теперь?От какого пользователя запускается вызванный каналом сценарий?

1 Ответ

0 голосов
/ 07 ноября 2011

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

$fd = fopen('php://stdin', 'r');
if (!$fd) {
   die("Unable to open stdin for input");
}

$fdw = fopen(...);
if (!$fdw) {
   die("Unable to open mail.txt for output");
}

Если ни один из триггеров die () не сработает, это не проблема с разрешениями.

Как одна стилистическая вещь, если ваш реальный код не намного сложнее и не хочет обрабатывать stdinкуски, вы могли бы просто сделать:

$email = file_get_contents('php://stdin');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...