2012-02-16 4 views
4

У меня есть папка с тремя разными скриптами php. email.php txt.php android.phpPHP и права на запись файла

Я отправляю электронные письма и/или txts в соответствующие сценарии и использую http POST для отправки данных в скрипт android.

Первоначально я был только адрес электронной почты и .txt, и используя это было все ок

$data = '//data fields condensed into a single string obtained from email or txt'; 
$filename= "output.php"; 
$newFile= fopen($filename, 'w+'); 
fwrite($newFile, $data); 
fclose($newFile);` 

Нет проблем, сценарии могли бы открыть/запись в файл, и если он не завершает работу, они создавали Это. папка не была записана.

Теперь у меня есть сценарий android.php, и изначально он не мог открыть/создать output.php, пока я не сделал всю папку доступной для записи. Теперь он может создать output.php, если потребуется.

Проблема в том, что либо скрипты могут создавать/записывать в output.php HOWEVER, как только файл создается одним из скриптов, другие не могут его записать Т.е. если скрипт android создает output.php , скрипты электронной почты и txt возвращают ошибки , если скрипты электронной почты или txt создают output.php, тогда ошибка возврата сценария андроида

ошибка, «неспособная передать поток» или что-то в этом роде.

Лоренцо (пользователь здесь, на SO) начал упоминать о пользователях (т. Е. Отправляемый по электронной почте сообщение будет рассматриваться как другой пользователь в команде http POST). Сценарии создают output.php с разрешениями 644 (без выполнения и только владелец может писать), и я не могу вручную изменить разрешения на 777 - хотя я бы предпочел получить способ, позволяющий скриптам создавать его, поэтому я могу удалить папку периодически по причинам резервного копирования и не нужно помнить, чтобы вернуть ее обратно и т. д.

Я думаю, что смогу объединить 3 сценария в один (надеюсь), но предпочел бы не слишком. У кого-нибудь есть другие идеи?

Благодаря

Обновление: Так как я новый пользователь и не мог «ответ» мой собственный вопрос -

Итак, с помощью всем, кто откликнулся, я выработала решение: Скрипты электронной почты и txt выполняются пользователем 'owner', а htmlPOST запускается пользователем '?'

Мне нужно было сделать папку chmod 777 для пользователя '?' для работы

Когда каждый скрипт запускается, он проверяет файл 'output.php'. Если этого не было, то после fclose я добавил chmod 777 - таким образом скрипты, запускаемые другими пользователями, могли бы открыть/записать позже. Если файл уже существует, то я не добавлял chmod, потому что, если он был неправильным пользователем, он создал ошибку. Так простой пример этого:

$data = '//data fields condensed into a single string obtained from email or txt'; 
$filename= "output.php"; 

if (file_exists($filename)){ 
$newFile= fopen($filename, 'w+'); 
fwrite($newFile, $data); 
fclose($newFile); 
} else { 
$newFile= fopen($filename, 'w+'); 
fwrite($newFile, $data); 
fclose($newFile); 
chmod($file, 0777); 
} 

Спасибо за вашу помощь!

+1

Похоже, что пользователь 'android.php' работает, когда он создает' output.php', отличается от пользователя, которым работают другие 2. Попробуйте сделать все 3 запустимым как один и тот же системный пользователь. Есть ли разница в выходе 'ls -l output.php', когда android vs other 2 создает файл? –

+0

Можете ли вы рассказать о своем вопросе более обобщенным образом? У вас есть 3 потока/процессов, которые должны связываться между ними, и вы используете файлы в качестве очередей? чего вы пытаетесь достичь? Если вы можете это описать - вы можете получить более качественные ответы, например, используя существующий шаблон проектирования, с которым вы, возможно, не знакомы. – alfasin

ответ

3

Ok, так и с помощь каждого, кто ответил, я разработал решение: Скрипты электронной почты и txt выполняются владельцем пользователя, а htmlPOST запускается пользователем. ?

Мне нужно было сделать папку chmod 777 для пользователя '?' для работы

Когда каждый скрипт запускается, он проверяет файл 'output.php'. Если этого не было, то после fclose я добавил chmod 777 - таким образом скрипты, запускаемые другими пользователями, могли бы открыть/записать позже. Если файл уже существует, то я не добавлял chmod, потому что, если он был неправильным пользователем, он создал ошибку. Так простой пример этого:

$data = '//data fields condensed into a single string obtained from email or txt'; 
$filename= "output.php"; 

if (file_exists($filename)){ 
    $newFile= fopen($filename, 'w+'); 
    fwrite($newFile, $data); 
    fclose($newFile); 
} else { 
    $newFile= fopen($filename, 'w+'); 
    fwrite($newFile, $data); 
    fclose($newFile); 

    chmod($filename, 0777); 
} 

Спасибо за вашу помощь!

1

Использование ls as @DavidXia предлагает и проверяет, кто владеет правами на выходные файлы. Они должны принадлежать пользователю, который выполнял скрипт, созданный ими. Если файлы принадлежат другим пользователям, вам нужно будет поместить пользователей в общую группу и назначить все файлы, принадлежащие этой группе (пользователи, которым принадлежат файлы, могут оставаться дискретными).Затем вы также захотите присвоить g + rw всем этим файлам через chmod.

+0

Я не знаю, как использовать команду ls -l. Я использую FireFTP для подключения, могу ли я сделать это там где-нибудь? – lifeIsGood

+0

Попробуйте щелкнуть правой кнопкой мыши по файлу и отобразить дополнительную информацию об этом. Можете ли вы добавить дополнительный столбец FireFTP для отображения прав собственности? –

+0

Да, они принадлежат другим пользователям. они упоминаются через номер, кажется, что «владелец» - 513, а метод post html - пользователь 99. номера остаются неизменными. Как поместить их в «группу»? и я не понимаю g + rw через комментарий chmod. – lifeIsGood

3

если это проблема разрешения, и вы

не может вручную изменить разрешения на 777

может быть, вы могли бы попробовать:

$filename= "output.php"; 

// programatically set permissions 
if(!file_exists($filename)){ 
    touch($filename); 
    chmod($filename, 0777); 
} 

$data = '//data fields condensed into a single string obtained from email or txt'; 
$newFile= fopen($filename, 'w+'); 
fwrite($newFile, $data); 
fclose($newFile); 
+0

Я просто попросил, но это не сработало. У вас будет еще несколько попыток за несколько минут. Спасибо за идею – lifeIsGood

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