搜尋
首頁php教程php手册深入讲解PHP线程并发种类
深入讲解PHP线程并发种类Jun 13, 2016 am 11:05 AM
php實現並行怎麼我們深入種類執行緒考慮講解

线程是我们在做项目中首要考虑的,在php中怎么实现线程呢,我们这里就看看PHP线程的实现。许多 PHP 开发人员认为,由于标准的 PHP 缺少线程功能,因此实际 PHP 应用程序不可能执行多任务处理。

例如,如果应用程序需要其他 Web 站点的信息,那么在远程检索完成之前它都必须停止。这是错误的!通过本文了解如何使用 stream_select 和 stream_socket_client 实现进程内 PHP 多任务处理。PHP 不支持线程。尽管如此,与前述大多数 PHP 开发人员所相信的想法形成对比的是,PHP 应用程序可以 执行多任务处理。让我们开始尽可能清晰地描述一下 “多任务” 和 “线程” 对于 PHP 编程的意义。

PHP线程并发的种类

首先抛开几个和主题无关的例子。PHP 与多任务或并发的关系十分复杂。在较高层次上,PHP 经常涉及多任务:以多任务方式使用 标准的服务器端 PHP 安装 —— 例如,作为 Apache 模块。换句话说,若干个客户机 —— Web 浏览器 —— 可以同时请求同一个 PHP 解释的页面,而 Web 服务器将差不多同时返回所有这些页面。

一个 Web 页面不会妨碍其他 Web 页面的发送,尽管可能会由于诸如服务器内存或网络带宽之类的受限资源而使它们相互之间略有妨碍。这样,实现并发 的系统级需求可能适合使用基于 PHP 的解决方案。就实现而言,PHP 允许它的管理 Web 服务器负责实现并发。

Ajax 名下的客户端并发近几年来也已成为开发人员关注的焦点。虽然 Ajax 的含义已经变得十分模糊,但是它的一个方面是浏览器显示可以同时执行计算和保留对诸如选择菜单项之类的用户操作的响应。这实际上就是某种 多任务。用 PHP 编码的 Ajax 就是这样 —— 但是不涉及任何特定的 PHP;用于其他语言的 Ajax 框架均以完全相同的方法操作。

只粗略地涉及 PHP 的第三个并发实例是 PHP/TK。PHP/TK 是 PHP 的扩展,用于为核心 PHP 提供可移植图形用户界面(GUI)绑定。PHP/TK 允许用 PHP 编写代码构造桌面 GUI 应用程序。其基于事件的特性将模拟一种易于掌握并且比线程更少出错的并发形式。此外,并发是 “继承” 自一项辅助技术,而不是 PHP 的基本功能。

向 PHP 本身添加线程支持的试验已经做过多次。据我所知,没有一次是成功的。但是,Ajax 框架和 PHP/TK 的面向事件的实现表明事件可能比线程能更好地体现 PHP 的并发。PHP V5 证明事实确实如此。使用标准的 PHP V4 和更低版本,必须按顺序执行 PHP 应用程序的所有工作。例如,如果程序需要在两个商业站点检索商品的价格,则请求第一个站点的价格,等待至响应到达,再请求第二个站点的价格,然后再次等待。如果程序请求同时完成若干项任务会怎么样?总体来看,程序将在一段时间内完成,在这段时间内,将始终进行连续处理。

第一个示例PHP线程新的 stream_select 函数及它的几个助手使这成为可能。请考虑以下示例。

清单 1. 同时请求多个 HTTP 页面

<ol class="dp-xml">
<li class="alt"><span><span><?php  </span></span></li>
<li class=""><span>echo "Program starts at ". date('h:i:s') . ".n";  </span></li>
<li class="alt"><span> </span></li>
<li class="">
<span>$</span><span class="attribute">timeout</span><span>=</span><span class="attribute-value">10</span><span>;  </span>
</li>
<li class="alt">
<span>$</span><span class="attribute">result</span><span>=</span><span class="attribute-value">array</span><span>();  </span>
</li>
<li class="">
<span>$</span><span class="attribute">sockets</span><span>=</span><span class="attribute-value">array</span><span>();  </span>
</li>
<li class="alt">
<span>$</span><span class="attribute">convenient_read_block</span><span>=</span><span class="attribute-value">8192</span><span>;  </span>
</li>
<li class=""><span> </span></li>
<li class="alt"><span>/* Issue all requests simultaneously; there's no blocking. */  </span></li>
<li class="">
<span>$</span><span class="attribute">delay</span><span>=</span><span class="attribute-value">15</span><span>;  </span>
</li>
<li class="alt">
<span>$</span><span class="attribute">id</span><span>=</span><span class="attribute-value">0</span><span>;  </span>
</li>
<li class=""><span>while ($delay > 0) {  </span></li>
<li class="alt">
<span>$</span><span class="attribute">s</span><span>=</span><span class="attribute-value">stream_socket_client</span><span>("phaseit.net:80", $errno,  </span>
</li>
<li class=""><span>$errstr, $timeout,  </span></li>
<li class="alt"><span>STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);  </span></li>
<li class=""><span>if ($s) {  </span></li>
<li class="alt"><span>$sockets[$id++]=$s;  </span></li>
<li class="">
<span>$</span><span class="attribute">http_message</span><span>=</span><span class="attribute-value">"GET /demonstration/delay?delay="</span><span> .  </span>
</li>
<li class="alt"><span>$delay . " HTTP/1.0rnHost: phaseit.netrnrn";  </span></li>
<li class=""><span>fwrite($s, $http_message);  </span></li>
<li class="alt"><span>} else {  </span></li>
<li class=""><span>echo "Stream " . $id . " failed to open correctly.";  </span></li>
<li class="alt"><span>}  </span></li>
<li class="">
<span>$delay </span><span class="attribute">-</span><span>= </span><span class="attribute-value">3</span><span>;  </span>
</li>
<li class="alt"><span>}  </span></li>
<li class=""><span> </span></li>
<li class="alt"><span>while (count($sockets)) {  </span></li>
<li class="">
<span>$</span><span class="attribute">read</span><span>=$sockets;  </span>
</li>
<li class="alt">
<span>stream_select($read, $</span><span class="attribute">w</span><span>=</span><span class="attribute-value">null</span><span>, $</span><span class="attribute">e</span><span>=</span><span class="attribute-value">null</span><span>, $timeout);  </span>
</li>
<li class=""><span>if (count($read)) {  </span></li>
<li class="alt"><span>/* stream_select generally shuffles $read, so we need to  </span></li>
<li class=""><span>compute from which socket(s) we're reading. */  </span></li>
<li class="alt"><span>foreach ($read as $r) {  </span></li>
<li class="">
<span>$</span><span class="attribute">id</span><span>=</span><span class="attribute-value">array_search</span><span>($r, $sockets);  </span>
</li>
<li class="alt">
<span>$</span><span class="attribute">data</span><span>=</span><span class="attribute-value">fread</span><span>($r, $convenient_read_block);  </span>
</li>
<li class=""><span>/* A socket is readable either because it has  </span></li>
<li class="alt"><span>data to read, OR because it's at EOF. */  </span></li>
<li class=""><span>if (strlen($data) == 0) {  </span></li>
<li class="alt"><span>echo "Stream " . $id . " closes at " . date('h:i:s') . ".n";  </span></li>
<li class=""><span>fclose($r);  </span></li>
<li class="alt"><span>unset($sockets[$id]);  </span></li>
<li class=""><span>} else {  </span></li>
<li class="alt">
<span>$result[$id] </span><span class="attribute">.</span><span>= $data;  </span>
</li>
<li class=""><span>}  </span></li>
<li class="alt"><span>}  </span></li>
<li class=""><span>} else {  </span></li>
<li class="alt"><span>/* A time-out means that *all* streams have failed  </span></li>
<li class=""><span>to receive a response. */  </span></li>
<li class="alt"><span>echo "Time-out!n";  </span></li>
<li class=""><span>break;  </span></li>
<li class="alt"><span>}  </span></li>
<li class=""><span>}  </span></li>
<li class="alt"><span>?>  </span></li>
</ol>

如果运行此清单,您将看到如下所示的输出。


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php怎么设置implode没有分隔符php怎么设置implode没有分隔符Apr 18, 2022 pm 05:39 PM

在PHP中,可以利用implode()函数的第一个参数来设置没有分隔符,该函数的第一个参数用于规定数组元素之间放置的内容,默认是空字符串,也可将第一个参数设置为空,语法为“implode(数组)”或者“implode("",数组)”。

php怎么查找字符串是第几位php怎么查找字符串是第几位Apr 22, 2022 pm 06:48 PM

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

php怎么将url的参数转化成数组php怎么将url的参数转化成数组Apr 21, 2022 pm 08:50 PM

转化方法:1、使用“mb_substr($url,stripos($url,"?")+1)”获取url的参数部分;2、使用“parse_str("参数部分",$arr)”将参数解析到变量中,并传入指定数组中,变量名转为键名,变量值转为键值。

php怎么去掉字符串首位的tab空白符php怎么去掉字符串首位的tab空白符Apr 22, 2022 pm 07:11 PM

在php中,可以利用ltrim()函数来去掉字符串首位的tab空白符,语法为“ltrim(string)”;当只给ltrim()函数传入一个参数,用于规定要检查的字符串时,可删除该字符串开始位置的空白字符(例空格、tab制表符、换行符等)。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器