PHP使用shell_exec后台处理Excel提示临时文件不存在的问题求助
解决PHP后台执行Excel处理时临时文件不存在的问题
核心问题:PHP会在HTTP请求结束后自动删除上传的临时文件,当后台进程启动时原请求已结束,临时文件已被清理;另外你传递的
tmp_name末尾带有空格,导致路径无效。具体解决步骤:
复制临时文件到永久存储目录
在原上传处理脚本中,先把上传的临时文件复制到一个不会被自动清理的目录(比如/var/uploads/temp/):// 先清理tmp_name末尾的空格 $cleanTmpName = trim($_FILES['file']['tmp_name']); $targetPath = '/var/uploads/temp/' . $_FILES['file']['name']; // 执行复制操作 if (copy($cleanTmpName, $targetPath)) { // 后续打包参数时使用这个新路径 } else { // 处理复制失败的异常情况 }修正参数中的路径错误
打包base64参数时,确保使用清理后的路径(去掉末尾空格),避免传递无效的文件路径。后台脚本处理完成后清理文件
在inventory_excel_upload.php处理完Excel后,删除复制的临时文件,避免占用磁盘空间:$processedFile = '/var/uploads/temp/' . $fileName; if (file_exists($processedFile)) { unlink($processedFile); }确保目录权限正确
给永久存储目录设置合适的权限,让运行PHP的用户(通常是www-data)拥有读写权限:chown -R www-data:www-data /var/uploads/temp/ chmod -R 755 /var/uploads/temp/稳定运行后台进程
使用nohup命令确保后台进程不会因会话结束而终止,同时重定向输出避免生成冗余日志:$encodedParams = base64_encode(json_encode([ 'file' => [ 'name' => $_FILES['file']['name'], 'type' => $_FILES['file']['type'], 'tmp_name' => $targetPath, // 使用复制后的永久路径 'error' => $_FILES['file']['error'], 'size' => $_FILES['file']['size'] ] ])); // 执行后台命令 shell_exec('nohup /www/server/php/74/bin/php -f /background_processes/inventory_excel_upload.php "' . $encodedParams . '" > /dev/null 2>&1 &');
内容的提问来源于stack exchange,提问作者Hasan Yüksektepe
相关产品推荐
相关产品推荐

