window,php利用fsockopen异步上传文件

在不熟悉Linux和swoole的情况下,通过研究popen和fsockopen解决大文件上传到OSS的问题。由于popen会等待进程结束,转向使用fsockopen实现异步上传,虽然速度快但存在错误检测风险。在TP5框架中测试成功,但在高并发场景下仍需优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直没学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');

最后测试挺快的,但是实际投入高并发使用,还需要改善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值