PHP 項目,線上碰到個奇怪問題,使用
fwrite
寫入
tmpfile()
失敗。這裡的失敗並不是指
fwrite
返回
FALSE
,而是返回
int(0)
,寫入 0 個位元組。代碼很簡單如下所示:
$f = tmpfile();$length = fwrite($f, '123');var_dump($length);
通過瀏覽器訪問,即php-fpm
方式下,輸出 int(0)
。我做了其他幾種情況的測試:
命令列環境:代碼原封不動,執行是可以成功寫入的。
php-fpm 瀏覽器訪問
:將 tmpfile()
替換成fopen('非 /tmp 目錄', 'w+')
,php-fpm
下可以寫入,輸出 int(3)
php-fpm 瀏覽器訪問
:將 tmpfile()
替換成 fopen('/temp/test-randomstring', 'w+')
,輸出 int(0)
當前問題已經通過其他迂迴方式解決,但是為何寫入失敗還沒有查出原因。最初是懷疑跟伺服器的磁碟剩餘空間有關(僅剩 10M),但是 1 2 兩次測試說明 10M 應該是夠用的。
請問大家有什麼好的查 BUG 思路?或碰到過類似問題?
更新, 新增了一段測試代碼
$name = date("His");echo "File /tmp/$name.txt\n";shell_exec('echo "123" > /tmp/'.$name.'.txt');var_dump(file_exists('/tmp/'.$name.'.txt'));var_dump(file_get_contents('/tmp/'.$name.'.txt'));
命令列執行,檔案寫入正常。 php-fpm
跑的時候,檔案始終寫入 0 位元組,但檔案是建立成功了的
回複內容:
PHP 項目,線上碰到個奇怪問題,使用fwrite
寫入tmpfile()
失敗。這裡的失敗並不是指fwrite
返回 FALSE
,而是返回int(0)
,寫入 0 個位元組。代碼很簡單如下所示:
$f = tmpfile();$length = fwrite($f, '123');var_dump($length);
通過瀏覽器訪問,即php-fpm
方式下,輸出 int(0)
。我做了其他幾種情況的測試:
命令列環境:代碼原封不動,執行是可以成功寫入的。
php-fpm 瀏覽器訪問
:將 tmpfile()
替換成fopen('非 /tmp 目錄', 'w+')
,php-fpm
下可以寫入,輸出 int(3)
php-fpm 瀏覽器訪問
:將 tmpfile()
替換成 fopen('/temp/test-randomstring', 'w+')
,輸出 int(0)
當前問題已經通過其他迂迴方式解決,但是為何寫入失敗還沒有查出原因。最初是懷疑跟伺服器的磁碟剩餘空間有關(僅剩 10M),但是 1 2 兩次測試說明 10M 應該是夠用的。
請問大家有什麼好的查 BUG 思路?或碰到過類似問題?
更新, 新增了一段測試代碼
$name = date("His");echo "File /tmp/$name.txt\n";shell_exec('echo "123" > /tmp/'.$name.'.txt');var_dump(file_exists('/tmp/'.$name.'.txt'));var_dump(file_get_contents('/tmp/'.$name.'.txt'));
命令列執行,檔案寫入正常。 php-fpm
跑的時候,檔案始終寫入 0 位元組,但檔案是建立成功了的
許可權
chmod 777 /tmp/test-randomstring
再試試可寫就說明是許可權問題
可以用chown改寫檔案擁有者,chmod再改為安全的許可權。