$_FILESでテンポラリファイルが取得できない場合の対処法【PHP】

$_FILESでテンポラリファイルが取得できない場合の対処法【PHP】プログラミング
$_FILESでテンポラリファイルが取得できない場合の対処法【PHP】

PHPでcsvアップロードみたいなシステムを構築する場合、「$_FILES」をよく利用すると思います。

昨今では便利なパッケージがいくつもあるので、「$_FILES」を使わない事も多いかもしれませんが。

ただ「$_FILES」でテンポラリファイルが取得できない場合に遭遇しませんか?

今日はそんな場合の対処法をご紹介いたします。

この記事では、「CentOS7」で「Apache」を利用している構成で説明致します。

このブログは現役のエンジニア(プログラマー歴が約12年)の僕(よしたか)が2019年12月後半から日々更新しております。

もしもアフィリエイトは会員登録後も無料です!
今すぐ会員登録してアフィリエイトを始めよう!

$_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」にする事もないかな~と個人的には思っています。

まとめ

この記事のおさらい
  • $_FILESでテンポラリファイルが取得できない場合はPrivateTmpを見る

いかがだったでしょうか。

このようにOSが上がったりすると、いろんなところで影響が出る場合がありますよね。

特に「CentOS7」は「CentOS6」とかからはガラッと変わっているので、諸々注意が必要です。

今日はさくっと以上となります!