5

次の PHP スクリプトは、ディレクトリの作成に失敗します。また、ファイルの作成にも失敗します (ディレクトリが既に存在する場合)。

ini_set('error_reporting', E_ALL);

define('ABSPATH', $_SERVER['DOCUMENT_ROOT']);
echo ABSPATH . '<br /><br />';

$dir_to_make = ABSPATH . '/aaatest';
$file_to_make = ABSPATH . '/aaatest/aaatest.txt';

echo umask() . '<br />';

mkdir($dir_to_make) or die('could not create directory');
fopen($file_to_make) or die('could not open/create file');

umask() は値 18 を返しています。ドキュメント ルートにはピリオドが含まれています ( /var/www/blah/websitename.com/httpdocs )。

umask() を完全には理解していませんし、適切に使用する方法もわかりません。それが問題かどうかはわかりませんが、可能性は高いようです。umask を変更し、ファイル/ディレクトリを作成してから元に戻す必要がありますか? ファイル/ディレクトリを変更/作成/編集するためのumaskは何ですか? サーバーを別の方法で構成する必要がありますか?

4

2 に答える 2

6

ドキュメント ルート内にファイルを作成するには、PHP プロセスにディレクトリへの書き込み権限が必要です。通常 (常にではありませんが)、PHP は Web サーバーを実行するのと同じユーザーとして実行されます。このユーザーの名前は、システムによって異なります。Ubuntu と Debian では、ユーザーは と呼ばれますがwww-data、他のシステムではwww、 またはapache、 またはapache2. 一部のシステムでは、root.

server superglobal: の値を調べることで、PHP がどのユーザーとして実行されているかを知ることができます $_SERVER['USER']phpinfo()このようなものを簡単に見る方法を提供します。通常、PHP ユーザーは Web サーバーのユーザーと同じです (常にではありません)。

ディレクトリの所有権とパーミッションの設定は、まったく別のトピックです。使用しているオペレーティング システム、サーバーに対するアクセス権とパーミッション、およびその他の多くのものによって異なります。これに関するポインタが必要な場合は、 serverfault.com から始めることができます。

幸運を。


[編集] OK、あなたが として実行していて、...apacheに新しいディレクトリを作成しようとしている/var/www/blah/mydomain.com/htdocs/場合、次を実行すると:

> ls -splad /var/www/blah/mydomain.com/htdocs

次のような表示が期待されます。

4 drwxr-xr-x 2 apache apache 4096 2010-07-22 20:54 /var/www/blah/mydomain.com/htdocs/

2 つの興味深い部分があります。

drwxr-xr-x意味: d= ディレクトリ; rwx= ユーザーには読み取り、書き込み、実行があります。r-x= グループには読み取りと実行のみがあります。r-x= 誰もが読み取りと実行のみを持っています。

-apache apache最初のものはファイル/ディレクトリを所有するユーザーの名前で、2 番目のものはファイル/ディレクトリを所有するグループの名前です。

したがって、次のようなものを見た場合:

4 drwxr-xr-x 2 root apache 4096 2010-07-22 20:54 /var/www/blah/mydomain.com/htdocs/

ディレクトリは(apacheではなく)によって所有されており、によってグループ化されていても、ディレクトリはグループ書き込み可能ではないため、機能しません。このシナリオでは、グループ書き込み権限 ( ) を追加するだけで、準備完了です。rootapachechmod g+w /var/www/blah/mydomain.com/htdocs

他に表示されるものは次のとおりです。

4 drw-r-xr-x 2 apache apache 4096 2010-07-22 20:54 /var/www/blah/mydomain.com/htdocs/

この場合、所有権は問題ありませんが、ディレクトリはその所有者によって書き込み可能ではありません。これは、所有者の書き込み権限を追加することで修正できますchmod u+w /var/www/blah/mydomain.com/htdocs

他にもたくさんのバリエーションがありますが、これが役立つかもしれません。

于 2010-10-31T00:32:19.740 に答える
2

fopen には 2 つの引数を指定する必要があります。変更してみる

fopen($file_to_make) or die('could not open/create file');

fopen($file_to_make,'w') or die('could not open/create file');
于 2010-10-31T00:12:06.300 に答える