不分享,做一切!
php拥有令人敬畏的且数量庞大的扩展跟特征,但是php当初设计这门语言的时候,是因为那个时候的web网站远远没有今天的强大!现在几乎所有的网站(含手机站)服务器都是多核的,如果不是多CPU跟多核,PHP是无法提供更好的服务的。虽然PHP正在非常迅速的展示及表达你的想法,但是当我们想要通过成熟的语言或者框架,建设更加完善的网页应用(网站)或者是数据库驱动的应用,因为PHP不能够让我们更好的支配硬件服务器。所以比较尴尬!但是多线程让PHP创建更完善【牛叉】的应用成为可能,这个特征是的你的个人网站能够做到一些以前不能够做到的事情!
基础
pthreads 扩展是一个专有的API,它可以让用户在PHP语言里面使用多线程。它包含了你创建多线程应用的全部工具,当然无论是web、还是控制台程序。
PHP程序可以创建、读取、写入及同步线程操作,含如下类型:Threads、Workers、Stackables【翻译者注释:V2 以上的版本 同 Threaded】。
Thread对象
用户可以通过继承Thread类来使用线程,当然这个类是通过pthreads拓展实现的。任何成员【函数/代码段/继承者】都可以通过引入线程类来读取及重写这个线程类的方法。任何继承于线程的程序,都可以执行任何的公开的及受保护的线程程序。当我们在程序中调用线程类里面的start方法的时候,线程类【继承线程类的子类】中的run方法将会作为一个独立的线程被执行。只有当上下文程序创建一个线程,并且开启start方法及join方法的时候。【翻译者注释:如果使用join 就是等待上一个线程结束,然后执行下一个线程,官方给的说明是同步】
Worker对象
Worker线程拥有持久的稳定性,表现在当这个线程创建及开启后是一直可用的,除非这个线程的引用超出了范围,也就是线程实例消失了。或者主动调用shutdown方法关闭了。任何在程序中使用Worker类及子类实例化的对象,当程序独立运行为一个独立线程时,这个Worker里面的run方法相对与存在Worker对象栈里面的其它程序,run方法将最先被调用。这样的话,这个run方法就可以用来初始化一些资源,方便后面栈中程序调用。【翻译者注释:注意在Workder对象里面stack方法内调用的其它线程的实例化会被执行,但是不是单独产生新的线程。只有Worker此时会单独产生线程,因为并没有调用其它线程的start方法】【脚本执行完成,这个Worker也会挂掉的。】
Stackable对象
栈排序【Stackable】对象在运行run方法期间可以读写及执行Worker线程,此外,任何继承于Stackable线程的子程序或者程序段,都可以读写或者执行它的自己的方法在线程执行前或者执行后。【翻译者注释:应该跟 Worker线程里面的 Stack相关吧。因为在最新的里面pthreads v3版本里面的没有Stackable类了,相关可以替换的应该是 threaded 类,感觉 threaded是最大的基类,然后 thread是子类,然后worker是 thread的子类】
同步
所有的pthreads对象可以通过::wait()及::notify()方法来构建线程同步,在子程序【程序段】中调用::wait()方法将会让线程等待执行,当调用::notify()方法将会唤起::wait()方法继续执行线程。这样就可以允许强大的线程PHP线程同步。
等等,什么是Threaded对象?
其中 Stackable、Thread、Worker可以被认为是Threaded的子类,Threaded可以认为是标准基础类。所以上述的类都具备基类的全部属性及方法。
任何想要应用在程序里面的多线程应用必须都是继承于Stackable、Thread、Worker这几个实用类【v3 以上版本 取消了 Stackable类】。这也就意味这每个子类都会天然具备run方法,但是不一定使用它【翻译者注释:因为run方法是在threaded这个最大的基类里面的,当然每个子类都有了】。这个threaded类经常会被实例化来进行真正的程序运算。也就是说,任何线程子程序都可以运行threaded的成员属性及函数,在运行前、中、后时期。
方法修饰符
在pthreads线程扩展中的Threaded类中的受保护[protected]的方法,意味着同一时间内之内有一个线程调用这个方法。threaded类中私有[prvate]方法,意味着只能在线程运行中进行调用【也就是:创建该线程的对象调用】。【翻译者注释:默认的threaded类里面的方法都是public的,用户需要自己添加受保护和私有的方法】
数据存储
作为首要原则,任何可以被序列化的数据都可以作为类成员属性进行存储【翻译者注释:类似于定义了魔术方法,对不存在的属性进行存取】,它能够在子类实例化的任何位置进行读写操作。不是所有的数据都会被序列化的,基础的类型将会存储相应的真实表单中。复杂的类型,如数组 和对象【非线程对象】才会被序列化后存储。存储完成后,就可以在任何使用该线程的位置进行读取操作。
甚至如下特殊情况,就是线程对象作为另一个线程的成员属性时候被引用的时候,同样的数据读取特性是一样的。
资源
这些扩展跟函数在PHP定义【请求】了一定的被占用的资源,pthreads会提供线程之间的资源共享【连接使用】,但是这些资源将会产生问题,绝大多数时间,资源是不应该在不同的线程中间共享的,更应该像是流或者sockets的方式管理资源。一般情况下,资源持久占用是不被支持的。
进击的的扩展:
pthreads扩展试图获取一个完整的结果。它的局限性及特征将会随时改变。这个是非常自然的。它的这些局限性通常都是通过继承强加的,虽然都是处于善意。pthreads 的目标就是提供可用的、多任务的、任何级别的、PHP解决方案,在这样的环境下pthreads诞生了,一些限制非常的必要,就是为了给大家提供一个稳定的环境!请大家谅解!【翻译者注释:最后那句我加的!】
牛叉!
多线程官网:
http://pthreads.org/
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。互联网+时代,时刻要保持学习,携手千锋PHP,Dream It Possible。