Я использую Ubuntu 16.04, стек LAMP установлен с apt-get
все работает нормально.
Однако иногда я вижу следующую ошибку, когда моя PHP-программа (PHP запускается с Server API Apache 2.0 Handler
) пытается записать файл в каталог, принадлежащий группе, отличной от www-data
основная группа (которая www-data
) но кому www-data
принадлежит тоже (я добавил www-data
пользователь этой другой группы и сделал ее второстепенной группой).
Поэтому: PHP работает с Apache как www-data:www-data
(пользователь: группа), www-data
пользователь, в свою очередь, принадлежит также к другой группе (это называется smsd
, это группа демона SMS, которую я использую), и когда PHP нужно записать в папку, например так:
drwxrwsr-t 2 smsd smsd 4096 Jul 10 11:40 outgoing/
Который принадлежит smsd:smsd
(обратите внимание, что группа может писать внутри outgoing
), иногда PHP может писать в эту папку, иногда нет!
Есть ли разумное объяснение этому поведению? Версия Apache — 2.4, версия PHP — 7.
id www-data
:
me@machine:/var/spool/sms# id www-data
uid=33(www-data) gid=33(www-data) groups=33(www-data),131(smsd)
Посмотрите, как это выводит, что www-data
принадлежит smsd
тоже.
Как я уже сказал, странно то, что это не происходит систематически. Иногда www-data
можете написать в эту папку, и он успешно создает файл (return array('status' => 'ok');
), иногда это не может, и мой сценарий не пишет файл (return array('err' => 'Error writing file.');
):
//...
$smsdSMSFileText = <<<EOF
To: $to
Alphabet: UTF-8
$message
EOF;
if (!file_put_contents($smsdSMSFileName, $smsdSMSFileText)) {
return array('err' => 'Error writing file.');
}
return array('status' => 'ok');
//...
Может быть, это потому, что некоторые из порожденных детей Apache бегут без вторичных групп (только как www-data:www-data
)? Является ли это возможным?
Спасибо за внимание.
Задача ещё не решена.
Других решений пока нет …