php的thread是个什么情况

路飞 发布于 2015/12/09 19:00
阅读 2K+
收藏 1
PHP

在用php做一个web项目。

有一个场景是用户请求进来,然后起一个子线程执行一个比较耗时的任务,同时主线程返回“正在处理”的信息。

在Java里一直用的方式就是从线程池里取一个线程(或者简单粗暴的直接new Thread)来处理子任务,同时主线程直接返回即可。

php这边我搜索了一下,要使用Thread的话,需要这个扩展http://php.net/manual/en/class.thread.php

编译安装好这个扩展,简单实验一下

另外我用的是php的CodeIgniter框架

这是定义的一个libraries帮助类


class Demo_Thread extends Thread{
	private $value;

	public function __construct($value){
		$this->value = $value;
	}
	
	public function run(){
		sleep(10);
		error_log('hi from thread # '. date('Y-m-d H:i:s'));
        }
}



这是一个Controller



class ADemo extends My_Controller {
			
	function __construct() {
		parent::__construct ();
	}
	
	public function atest(){
		error_log('start # ' . date('Y-m-d H:i:s'));
		$demo_thread = new Demo_Thread('a');
		$demo_thread->start();
		error_log('end # ' . date('Y-m-d H:i:s'));
                echo 'ab';
        }
}


结果并没有很快返回结果,而是等thread里的sleep(10)执行完了之后才返回的结果

在php.net的介绍里有这样一句话

After the run method is executed the Thread will exit immediately, it will be joined with the creating Thread at the appropriate time.

难道主线程总是要join子线程么,有没有可以异步执行的方法?

加载中
0
eechen
eechen
不建议在PHP-FPM里使用多线程,写不好会导致工作进程频繁崩溃.使用PHP就应该转变思路,不要照搬Java那一套.异步处理耗时任务也不一定要使用多线程.你完全可以在PHP中用 pclose(popen('/path/to/task.php &', 'r')); 异步打开一个进程处理耗时的任务,PHP-FPM则返回信息给浏览器提示"正在处理",task.php这个cli脚本处理完成任务后,把数据库当前任务的状态标记为"完成",前端AJAX定时轮询到这个任务为"完成",则提示用户即可.
路飞
路飞
恩多谢指点,确实是刚开始接触php,很多特性不太了解~
eechen
eechen
回复 @百世经纶之傲笑红尘 : 说实话我很讨厌那些在中文里混英文单词秀洋气的人.因为Java有个多线程就沾沾自喜地嘲笑PHP就真的太可笑了.Nginx和PHP-FPM这些C实现的稳健的网络程序采用的都是多进程架构,JAVAer内心会不会也深深地鄙视人家呢?
百世经纶之傲笑红尘
百世经纶之傲笑红尘
Java搞线程SoEasy的啦,你们PHP我就不知道会怎样了
0
phpeechen
phpeechen
如果任务要定时 怎么办
0
phpeechen
phpeechen
比如说执行一个操作 马上返回结果 后台5分钟后 在执行另外的任务 用php 咋搞
西湖老司机
西湖老司机
回复 @phpeechen : rabbitmq消息队列,在给php装个amqp扩展
phpeechen
phpeechen
回复 @o__o : 哪一个函数 跟eechen 说的pclose一样吗
phpeechen
phpeechen
回复 @o__o : 消息队列 是php 里的 什么 方法
mirai_
mirai_
消息队列才是主流的解决方案
0
Crazy罗小杰
phpeechen
phpeechen
比如说任务执行完了以后 还要调用 thinkphp 里的方法
phpeechen
phpeechen
think php 里能用 swoole
返回顶部
顶部