Поскольку это кажется общим вопросом со многими ответами, которые не охватывают все, с чем я столкнулся; Я добавлю свой опыт с этой проблемой и решение, которое действительно работало.
Я заметил, что вы не устанавливаете рекурсивный флаг, что вы не используете флаг полномочий и что вы не используете абсолютный путь к серверу.
Согласно абсолютному пути, это важно для обеспечения того, чтобы пользователь apache, www-data, действительно имел разрешения на изменение всего в непосредственной родительской папке.
Вы пробовали команду с флагом разрешений или экспериментировали с текущим представлением umask и восьмеричным (согласно PHP.net)?
В настоящее время в документации PHP на mkdir указано, что если не указан параметр permissions, в системах Linux по умолчанию используется значение "777", которое является наименее ограничительным (и по соображениям безопасности не рекомендуется), и что в документации также говорится, что разрешения, вероятно, следует указывать в восьмеричный, поэтому к разрешениям следует добавить ведущий ноль. Также есть ссылки на текущий umask, который вы также можете проверить, потому что, если ваша текущая маска ненулевая, значение маски вычитается из фактического набора разрешений, если текущий umask равен 022, и вы указываете 777, разрешения вы получить 755.
В моем случае предложения PHP.net не устранили проблему, и когда я посмотрел на то, как эта проблема проявляется, оказалось, что у пользователя www-data отсутствуют некоторые необходимые разрешения для доступа, изменения или чтения созданных папок и файлы. Я попытался установить флаг разрешений как «6640», и это действительно сработало; Более того, это привело к тому, что все подкаталоги и файлы унаследовали разрешения «640» (рассмотрим 640 и добавление вашей учетной записи в группу www-data).
Короче говоря, есть два варианта, один из документации PHP, который не работает для меня, но может работать для некоторых:
$old = umask(0);
mkdir("/path/some_dir/", 0755, true);
umask($old);
Тот, который работал для меня, хотя и с несколько странным поведением:
$old = umask(0000);
mkdir("/var/www/html/somewebsite/images/somefolder/somefolder/", 6640, true);
umask($old);
Обратите внимание, что я на самом деле не предоставлял разрешения на выполнение в моем скрипте.
Я заметил, что есть ряд других вариантов этого вопроса на других сайтах, которые нашли некоторую информацию PHP.net полезной в своем случае, но я включил ответ, который в итоге работал в моем случае. Я надеюсь, что эта информация поможет некоторым людям по крайней мере.