一直没学linux,swoole也没学。项目的文件上传一直都是个问题,文件一大,上传到OSS就要一两分钟。如果用主程序上传,用户体验肯定不太好。所以最近了解了一下popen,fsockopen。
一、先说说popen吧,可以创建一个新的进程管道执行cmd命令,执行php脚本。但是我一直测试,程序一定要等待进程结束才结束请求。
$commandLine = "php E:\phpStudy\PHPTutorial\WWW\index.php";
$commandLine = "nohup php E:\phpStudy\PHPTutorial\WWW\index.php & 2>&1";
pclose(popen($commandLine, 'r'));
百度了一下,好像可以通过nohup 挂起,我在windown下测试过了,语法错误了。应该是Linux下才行吧。
二、popen不行,我就改用了fsockopen。打开一个网络连接或者一个Unix套接字连接,不用等待结果(但是这样异步有个风险就是检测不了错误,导致出错时文件没上传成功)。
我使用的是TP5框架
$file = request()->file("file");
$fileName = 'dior_' . time();
$info = $file->validate(['ext' => 'jpg,jpeg,png,gif,bmp,avi,wma,rmvb,rm,flash,mp4,mid,3GP,txt'])->move("E:/phpScript/file", $fileName);
if (!$info) {
return false;
}
$fileName = $info->getSaveName();
$php_Path = "127.0.0.1";
$fp = fsockopen($php_Path, 8002);
$out = "GET /dc/user/test HTTP/1.1\r\n";
$out .= "Host: " . $php_Path . "\r\n";
$out .= "Connection: Close\r\n\r\n";
stream_set_blocking($fp, true);
stream_set_timeout($fp, 1);
fwrite($fp, $out);
usleep(1000);
fclose($fp);
return apiReturn(200, 'success');
最后测试挺快的,但是实际投入高并发使用,还需要改善。