猿问
PHP有线程吗?
PHP有线程吗?
我发现了这个
称为线程的PECL包
,但还没有发布。PHP网站上什么都没有。
ABOUTYOU
浏览 751
回答 3
3回答
天涯尽头无女友
据我所知没有什么可用的。其次,最好的办法是让一个脚本通过CLI执行另一个脚本,但这有点不成熟。根据您要做的事情以及它的复杂程度,这可能是一种选择,也可能不是一种选择。
0
0
0
蛊毒传说
的PHP手册螺纹延期:线程是一个面向对象的API,允许用户在PHP中进行多线程处理.它包括创建针对Web或控制台的多线程应用程序所需的所有工具。PHP应用程序可以创建、读取、写入、执行和同步线程、工作者和堆栈。虽然这听起来难以置信,但这是完全正确的。今天,PHP可以为那些想尝试它的人多线程.PHP的第一个版本是2000年5月22日,它附带了一个线程安全体系结构-在多线程SAPI(ServerAPI)环境中,它可以在单独的线程中执行它的解释器的多个实例。在过去的13年中,这一架构的设计得到了维护和发展:从那以后,它一直在世界上最大的网站上投入生产使用。用户域中的线程从来都不是PHP团队关心的问题,现在仍然如此。您应该了解,在PHP进行业务的世界中,已经有了一种扩展-添加硬件的定义方法。多年来,PHP已经存在,硬件变得越来越便宜,因此PHP团队越来越不关心这个问题。虽然它越来越便宜,但它也变得更强大了;今天,我们的手机和平板电脑都有双核和四核架构,以及大量的RAM,我们的桌面和服务器通常有8或16核,16 G和32 G内存,尽管我们可能并不总是能够在预算范围内拥有两台,而拥有两台式机对我们大多数人来说很少有用。另外,PHP是为非程序员编写的,它是许多业余爱好者的母语.PHP之所以如此容易采用,是因为它是一种易于学习和编写的语言。PHP之所以今天如此可靠,是因为它的设计需要大量的工作,而且PHP组所做的每一个决定都是如此。它的可靠性和纯粹的伟大,让它在光天化日之下,在这么多年之后,它的竞争对手已经下降到时间或压力。多线程编程对大多数人来说并不容易,即使有了最连贯和最可靠的API,也有不同的事情要考虑,还有许多误解。PHP组不希望用户土地多线程成为一个核心特性,它从来没有得到认真的关注-这是正确的。对于每个人来说,PHP不应该是复杂的。考虑到所有因素,允许PHP利用它的生产准备和经过测试的特性仍然有好处,以便能够充分利用我们所拥有的功能,而添加更多的功能并不总是一种选择,而且对于许多任务来说,并不是真正需要的。对于那些想要探索它的人来说,p线程实现了一个允许用户使用多线程PHP应用程序的API。它的API在很大程度上是一项正在进行的工作,并指定了一个稳定和完整的beta级别。众所周知,PHP使用的一些库并不是线程安全的,程序员应该清楚地知道,线程不能改变这一点,也不尝试。但是,任何线程安全库都是可用的,就像在解释器的任何其他线程安全设置中一样。线程使用POSIX线程(即使在Windows中),程序员创建的是真正的执行线程,但是要使这些线程有用,它们必须知道PHP-能够执行用户代码、共享变量并允许一种有用的通信手段(同步)。因此,每个线程都是使用解释器实例创建的,但从设计上看,它的解释器与解释器的所有其他实例都是隔离的-就像多线程服务器API环境一样。线程试图以一种理智和安全的方式来弥合这一缺口。C中的线程程序员所关心的许多问题对于线程程序员来说并不重要,从设计上看,在读和写(RAM)上都是复制的(RAM很便宜),所以没有两个实例可以操作相同的物理数据,但是它们都会影响另一个线程中的数据。PHP在其核心编程中可能使用线程不安全的特性这一事实是完全不相关的,用户线程,以及它的操作是完全安全的。为什么在读时复制,在写上复制:public function run() { ... (1) $this->data = $data; ... (2) $this->other = someOperation($this->data); ...}(3) echo preg_match($pattern, $replace, $thread->data);(1)当p螺纹对象数据存储上持有读、写锁时,将数据从其在内存中的原始位置复制到对象存储区。线程不调整变量的重新计数,Zend能够释放原始数据,如果没有对它的进一步引用。(2)某些操作的参数引用对象存储,存储的原始数据(它本身是(1)结果的副本)被再次复制到zval容器中,当这种情况发生时,在对象存储上保持读锁,释放锁,引擎可以执行函数。当创建zval时,它的折算数为0,使引擎能够在操作完成后释放副本,因为不存在对它的其他引用。(3)preg_Match的最后一个参数引用数据存储,获得一个读锁,将(1)中的数据集复制到zval中,再一次以0作为折算。锁被释放,对preg_match的调用对数据副本(即原始数据的副本)进行操作。要知道的事情:对象存储的哈希表,其中存储数据,线程安全,是基于PHP附带的TsHashTable,由Zend提供。对象存储有一个读和写锁,为TsHashTable提供了一个额外的访问锁,这样如果需要的话(并且它需要,var_dump/print_r,就可以像PHP引擎想要引用的那样直接访问属性),线程可以在定义的API之外操作TsHashTable。只有在复制操作发生时才持有锁,当复制完成后,锁才会按合理顺序释放。这意味着:当发生写入时,不仅保持读和写锁,而且还持有额外的访问锁。表本身被锁定,没有其他上下文可以锁定、读取、写入或影响它的方法。当读取发生时,不仅保持读锁,而且还保留附加访问锁,同样,表也会被锁定。没有任何两个上下文可以从物理上或同时从对象存储中访问相同的数据,但是在任何具有引用的上下文中进行的写入都会影响在具有引用的任何上下文中读取的数据。这是共享的,没有架构,唯一的生存方式是共存。有些精明的人会发现,这里有大量的复制,他们会怀疑这是否是一件好事。在动态运行时中进行了相当多的复制,这是动态语言的动态。线程是在对象级别实现的,因为可以对一个对象进行良好的控制,但是方法-程序员执行的代码-有另一个上下文,不需要锁定和复制本地方法范围。对于p螺纹对象,对象作用域应该被看作是在上下文之间共享数据的一种方式,即它的用途。考虑到这一点,您可以采用一些技术来避免锁定对象存储,除非这是必要的,例如将局部变量传递给线程对象中的其他方法,而不是在执行时让它们从对象存储中复制。PHP可用的大多数库和扩展都是第三方的薄包装,PHP核心功能在某种程度上也是一样的。线程不是POSIX线程的薄包装器;它是基于POSIX线程的线程API。在PHP中实现线程是没有意义的,因为它的用户不理解或不能使用。一个不知道互斥是什么或不知道什么是互斥的人没有理由能够利用他们所拥有的一切,无论是在技能上还是在资源方面。一个对象的功能类似于一个对象,但是如果两个上下文发生冲突,那么p线程就会提供稳定性和安全性。任何在java中工作过的人都会看到在java中的线程对象和线程之间的相似之处,这些人无疑会看到一个名为ConcurrentModificationException的错误-因为如果两个线程同时写入相同的物理数据,这听起来是Java运行时引发的错误。我理解它存在的原因,但它让我感到困惑的是,有了这么便宜的资源,加上运行时能够准确地而且只有在用户安全的时候才能检测到并发性,它选择在运行时抛出一个可能致命的错误,而不是管理数据的执行和访问。线程不会发出这样愚蠢的错误,我相信,API是为了使线程尽可能稳定和兼容而编写的。多线程不像使用一个新的数据库,应该密切关注手册中的每一个单词,以及随线程一起提供的示例。最后,来自PHP手册:过去和现在都是一个实验,取得了很好的效果。它的任何限制或特性在任何时候都可能发生变化,这就是实验的本质。它的限制-通常是由实现施加的-存在是有充分理由的;p线程的目的是在任何级别上为PHP中的多任务处理提供一个有用的解决方案。在线程执行的环境中,为了提供稳定的环境,需要一些限制和限制。
0
0
0
随时随地看视频
慕课网APP
相关分类
PHP
php如何把参数放在Http Request Heade????
1 回答
我要回答