如何将move_uploaded_file的错误记录到文件中

时间:2014-07-23 15:51:11

标签: php error-handling

我有一些上传文件的代码,它与我在另一台服务器上工作的完全相同的代码,但它不能在这台新服务器上运行

// Move the file into the new folder
move_uploaded_file($_FILES["file"]["tmp_name"],'./img/myfolder/1/'. $_FILES["file"]["name"]);

我知道我可以使用:

if(move_uploaded_file($_FILES["file"]["tmp_name"],'./img/myfolder/1/'. $_FILES["file"]["name"])){
echo "success";
} else{
echo "failure";
}

但是我有2个问题,脚本不直接从页面运行,另一个我无法访问源代码的应用程序来调用该页面并发送图像。所以我不能在页面错误中做任何我需要将错误记录到文件中。

第二个问题和主要问题是我不知道如何找出错误是什么。如果调用else语句,是否存在可以提取的错误代码。我已将文件夹和子文件夹设置为777,仅用于测试目的以排除权限问题,在推送到生产之前解决问题后解决问题。

我还检查了apache server error.log文件,它没有显示任何内容

1 个答案:

答案 0 :(得分:1)

我会做这样的事情。

 $debug_file = _DIR_.'/debug.txt';

 $source = $_FILES["file"]["tmp_name"];
 $dest = './img/myfolder/1/'. $_FILES["file"]["name"];


if(! @move_uploaded_file($source,$dest) ){
     file_put_contents(  $debug_file, "ERROR[ ".date('Y-m-d H:i:s')." ] Could not move[ $source ] to[ $dest ]\n", FILE_APPEND);
     exit();
}

然后,当您拥有source和dest路径时,您可以确保它们确实存在于正确的位置。

-note- @符号将禁止正常的PHP警告,因为我们无法移动文件,但正如我们将其记录下来一样,这样可以防止它被阻挡。

我也放了一个退出,我假设要求这个脚本让文件正常工作,这样就足以让它失败,不需要检查是否成功。

最有可能的是,文件路径错误

你甚至可以输出缓冲区php错误,就像这样,

ob_start();
$moved = move_uploaded_file($source,$dest);
$message = ob_get_clean();
if(!$moved){
    file_put_contents(  $debug_file, "ERROR[ ".date('Y-m-d H:i:s')." ] Could not move[ $source ] to[ $dest ] PHP message[ $message ]", FILE_APPEND);
 exit();
}

输出缓冲可以在后台运行的脚本上创建奇迹,

http://php.net/manual/en/function.ob-get-clean.php