web-dev-qa-db-ja.com

設定PHP tmp dir-PHPアップロードが機能しない

Valums file uploader を使用して、進行状況バーのあるWebページを介したファイルのアップロードに取り組んでいます。ほとんどすべてが正常に動作しますが、アップロード中にファイルが保存されるデフォルトのtmpディレクトリを変更することはできません。

_/upload_はサイズが制限されたRAMディスクにマウントされるため、デフォルトのシステム_/tmp_ディレクトリではなく、_/tmp_ディレクトリに保存する必要があります4µMBとユーザーは約10MBのファイルをアップロードします。

多くのWebページを検索しましたが、解決策はありませんでした。 _php.ini_に一時ディレクトリを設定しました:

_upload_tmp_dir =/upload
_

_/upload_ dirにアクセス許可を設定しました。Apacheはファイルの所有者であるため、ディレクトリはPHPによって確実に書き込み可能です。

ファイルアップローダーのターゲットパスを_/upload_に設定しました。アップロード後にもこのディレクトリにファイルを保存するためです。最終結果は小さなファイルが正常にアップロードされることですが、4MBを超えるファイルはアップロードに失敗します。この動作の唯一の理由は、アップロード中にファイルが_/tmp_に保存されることです。確かに、sys_get_temp_dir()で確認し、結果は_/tmp_- so PHP php.iniディレクティブを無視するか、他の方法がありますアップロード中にファイルが保存される場所を設定します。

ああ、最後の情報:_open_basedir_は設定されていないため、PHPディスクへのアクセスはファイルのアクセス許可によってのみ制限されます。

26
Wookie88

ここで説明した問題はかなり前に解決されましたが、アップロードが機能しなかった主な理由は何であるかを本当に覚えていません。アップロードが機能するように修正が必要なことが複数ありました。私は、同様の問題を抱えている他の人を助けるかもしれないチェックリストを作成しました。それを編集して、できるだけ役立つようにします。チャットで前に言ったように、私は組み込みシステムで作業していたので、非組み込みシステムではいくつかの点がスキップされる場合があります。

  • チェックupload_tmp_dir php.iniで。これは、PHP=がアップロード中に一時ファイルを保存するディレクトリです。

  • チェックopen_basedir php.iniで。定義されている場合、PHP指定されたパスとそのサブディレクトリへの読み取り/書き込み権限。制限upload_tmp_dirはこのパス内にあります。

  • チェックpost_max_size php.iniで。 20 MBのファイルをアップロードする場合は、post_max_size = 21M。これは、おそらくアップロード中に使用しているPOSTメッセージの最大サイズを定義します。

  • チェックupload_max_filesize php.iniで。これは、アップロードできる最大のファイルを指定します。

  • チェックmemory_limit php.iniで。これは、スクリプトが消費できるメモリの最大量です。アップロードサイズよりも小さくすることはできないことは明らかです(正直なところ、PHPが一時ファイルのコピー中にバッファリングしていることは確かではありません)。

  • WebサーバーでPHPによって使用されている正しいphp.iniファイルを確認していることを確認してください。最良の解決策は、ここで説明するディレクティブでスクリプトを実行することです http:// php.net/manual/en/function.php-ini-loaded-file.phpphp_ini_loaded_file 関数)

  • どのユーザーphpが実行されているかを確認します(実行方法はこちらを参照してください: どのユーザーphpが実行されているかを確認する方法? )。私はさまざまなディストリビューションとサーバーに取り組んできました。 Apacheの場合もありますが、rootの場合もあります。とにかく、このユーザーが一時ディレクトリとアップロード先のディレクトリで読み取りと書き込みの権限を持っていることを確認してください。サブディレクトリにアップロードする場合は、パス内のすべてのディレクトリを確認してください(たとえば、/dir1/dir2/-両方をチェックdir1およびdir2

  • 組み込みプラットフォームでは、フラッシュカードに保存されているルートファイルシステムへの書き込みを制限する必要があります。これにより、このカードの寿命が延びます。スクリプトを使用してファイルの書き込みを有効または無効にする場合は、アップロードする前に書き込みを有効にしてください。

  • PHP> 5.4セッションに基づいたアップロード監視に深刻な問題がありました(ここで説明したように http://phpmaster.com/tracking-upload-progress-with-php-and-一部のプラットフォームではjavascript / )最初は簡単なものを試してください( http://www.dzone.com/snippets/very-simple-php-file-upload )。それは機能し、より洗練されたメカニズムを試すことができます。

  • Php.iniに変更を加えた場合は、サーバーを再起動して構成が再読み込みされるようにしてください。

62
Wookie88

私はこの問題に長い間苦労しました...私の解決策は、phpスクリプトを含むフォルダー内のphp.iniファイルを変更することでした。ルートでphp.iniを変更しても問題は解決しなかったため、これは重要でした(きめ細かな制御のために各フォルダーにphp.iniがあります)。 php.iniの関連エントリは次のようになりました。..(この問題にはoutput_bufferingはおそらく必要ありません)

output_buffering = On 
upload_max_filesize = 20M 
post_max_size = 21M
2
CapCrunch

私の問題はselinuxでした...

Go sestatus

現在のモード:強制の場合

次にchcon -R -t httpd_sys_rw_content_t/var/www/html

以下を使用してphpファイルを作成します。

<?php
    print Shell_exec( 'whoami' );
?>

または

<?php echo exec('whoami'); ?>

webブラウザで出力を試してください。 出力がユーザーの例ではない場合:www-data次のステップに進みます

ルートとして開く:

/ etc/Apache2/envvars

これらの行を探します:

export Apache_RUN_USER =ユーザー名

export Apache_RUN_GROUP = group-name

例:

apache_RUN_USER = www-dataをエクスポートします

apache_RUN_GROUP = www-dataをエクスポートします

ここで:

username =使用しているフォルダーにアクセスできるユーザー名group =読み取り+書き込み+実行アクセス権を付与したグループ

次のように変更します。

export Apache_RUN_USER = "username"

export Apache_RUN_GROUP = "group"

ユーザーにまだアクセス権がない場合:

Sudo chmod 775 -R「r/w/xアクセスを許可するフォルダーのディレクトリ」