目前用workerman/http-client来异步请求,折腾了一段时间发现虽然可以异步请求,但还是不能满足我的需求。
workerman/http-client只能是get或者是post其他服务器,现在服务器的fm框架也可以多进程呀,如果我把服务器的进程数限制为1,那么还是会出现堵塞。
测试步骤:
设置了三个请求 a b c
a sleep(10)
b sleep(5)
c 立即输出
服务器的子进程设置为1
那么就开始闭塞了,依次出来的是 a b c 。
异步或者协程 GO java 是可以做到不创建子进程 直接按实际请求时间出来的 也就是 c b a 这个顺序
大佬们 有没有办法没?我是跟thinkphp 5 集成用的
改GuzzleHttp试试
这个没有本质的区别,就算异步,目标服务器还是会需要子进程的,所以异步应该不是这样用的
异步应该是按需使用,例如用户注册,然后需要给用户发一条邮件,那么在用户注册后,先吧注册的基本资料返回给前端,然后发邮件+积分或者其他逻辑就异步的处理
像你说的这个邮件的情况其实可以用消息队列去做,就包括发送邮件都可以放到队列去,java没用过,golang他是开辟一个轻量级的线程去做异步或者并发操作的,但PHP是多进程单线程,你开单进程他肯定阻塞了啊,要么开多进程,要么扔到队列里去吧
我在mac上测试,单进程http-client请求也不会阻塞啊,workerman应该每一个进程都能支持很多连接
是的没错,异步用异步消息列队可以处理,但跟楼下说的那样,tp是基于fpm的,必须要依靠子进程。其实我想问有没有类似于swoole的方案,可以优化并自定义进程,让进程使用灵活一点的方案。
没太理解你说的类似于swoole的啥方案,但是webman本身支持自定义进程的啊
https://www.workerman.net/doc/webman/process.html
thinkphp 5是基于php-fpm的,php-fpm的机制就是那样,只开一个进程的话所有请求排队处理。
php-fpm开多进程就好了