PHPでcsvアップロードみたいなシステムを構築する場合、「$_FILES」をよく利用すると思います。
昨今では便利なパッケージがいくつもあるので、「$_FILES」を使わない事も多いかもしれませんが。
ただ「$_FILES」でテンポラリファイルが取得できない場合に遭遇しませんか?
今日はそんな場合の対処法をご紹介いたします。
この記事では、「CentOS7」で「Apache」を利用している構成で説明致します。
もしもアフィリエイトは会員登録後も無料です!
今すぐ会員登録してアフィリエイトを始めよう!
$_FILESでテンポラリファイルが取得できない
<form action="/csv_uoload.php" method="post" enctype="multipart/form-data">
<input type="file" name="csv" value="ファイルを選択"></p>
<input type="submit" value="ファイルをアップロード"></p>
</form>
まずはこのような感じでcsvファイルをアップロードできるように準備します。
「csv_uoload.php」にて、
var_dump($_FILES);
このように実行すると、
array(1) {
["up"]=>
array(5) {
["name"]=>
string(10) "xxxxx.csv"
["type"]=>
string(0) "xxxxx"
["tmp_name"]=>
string(0) "xxxxx"
["error"]=>
int(0)
["size"]=>
int(0)
}
}
通常はこのように返されますが、
array(1) {
["up"]=>
array(5) {
["name"]=>
string(10) "sample.csv"
["type"]=>
string(0) ""
["tmp_name"]=>
string(0) ""
["error"]=>
int(6)
["size"]=>
int(0)
}
}
このようにテンポラリファイル名(tmp_name)が取得できない場合があります。
この時の「error」が「6」になっており、こちらは「テンポラリフォルダがない為のエラー」となります。
値: 6; テンポラリフォルダがありません。PHP 5.0.3 で導入されました。
Wikipediaより引用
$_FILESのテンポラリファイルが取得できない原因はOSの問題かも?
一番多い問題としては、「CentOS7」とかを使っていませんか?
そんな僕も前は「CentOS6」とか「CentOS5」とか使っていて上記のような事は起こりませんでした。
「CentOS7」にすると「Systemd」というもので各サービスを管理し、それが原因のようでした。
通常テンポラリディレクトリというのは「/tmp」とか「/var/tmp」とかですが、その中にさらにサービス毎にディレクトリを分けて管理するようになりました。
何も知らず、僕は「CentOS7」で開発中に「/tmp」の中のファイルやフォルダを全部削除した時に、この症状に陥りました。
解決方法はPrivateTmpの設定
では実際の解決方法ですが、「PrivateTmp」という値を「OFF」にしてやればOKです。(デフォルトでは「ON」)
# mkdir /etc/systemd/system/httpd.service.d
# echo "[Service]" > /etc/systemd/system/httpd.service.d/privatetmp.conf
# echo "PrivateTmp=false" >> /etc/systemd/system/httpd.service.d/privatetmp.conf
# systemctl daemon-reload
# systemctl restart httpd
ちなみに「Nginx」でも同じような感じの解決方法で問題ないかと思います。
しかしこの仕様をわかっていれば、特に「OFF」にする事もないかな~と個人的には思っています。
まとめ
いかがだったでしょうか。
このようにOSが上がったりすると、いろんなところで影響が出る場合がありますよね。
特に「CentOS7」は「CentOS6」とかからはガラッと変わっているので、諸々注意が必要です。
今日はさくっと以上となります!