php多路复用(多线程)

 更新时间:2016年11月25日 16:09  点击:1322

最近研究php多线程的问题,发现中文资源少的可怜,仅有的几篇文章被转了又转,但文中内容价值有限。搜索过程中发现国外很多网站引用的一篇文章写的不错,所以翻译过来。

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
问题:
假设你正在写一个基于多台服务器的php应用,理想的情况时同时向多台服务器发送请求,而不是一台接一台。
可以实现吗?
回答:

当有人想要实现并发功能时,他们通常会想到用fork或者spawn threads,但是当他们发现php不支持多线程的时候,大概会转换思路去用一些不够好的语言,比如perl。

其实的是大多数情况下,你大可不必使用fork或者线程,并且你会得到比用fork或thread更好的性能。

假设你要建立一个服务来检查正在运行的n台服务器,以确定他们还在正常运转。你可能会写下面这样的代码:

<?php
$hosts = array("host1.sample.com", "host2.sample.com", "host3.sample.com");
$timeout = 15;
$status = array();
foreach ($hosts as $host) {
    $errno = 0;
    $errstr = "";
    $s = fsockopen($host, 80, $errno, $errstr, $timeout);
    if ($s) {
        $status[$host] = "Connectedn";
        fwrite($s, "HEAD / HTTP/1.0rnHost: $hostrnrn");
        do {
            $data = fread($s, 8192);
            if (strlen($data) == 0) {
            break;
            }
            $status[$host] .= $data;
        } while (true);
        fclose($s);
    } else {
        $status[$host] = "Connection failed: $errno $errstrn";
    }
}
print_r($status);
?>

它运行的很好,但是在fsockopen()分析完hostname并且建立一个成功的连接(或者延时$timeout秒)之前,扩充这段代码来管理大量服务器将耗费很长时间。
因此我们必须放弃这段代码;我们可以建立异步连接-不需要等待fsockopen返回连接状态。PHP仍然需要解析hostname(所以直接使用ip更加明智),不过将在打开一个连接之后立刻返回,继而我们就可以连接下一台服务器。
有两种方法可以实现;PHP5中可以使用新增的stream_socket_client()函数直接替换掉fsocketopen()。




PHP的优点:

  1. 跨平台,性能优越,跟Linux/Unix结合别跟Windows结合性能强45%,并且和很多免费的平台结合非常省钱,比如LAMP(Linux/Apache/Mysql/PHP)或者FAMP(FreeBSD/Apache/Mysql/PHP)结合,或者数据应用够大可以考虑换PostgreSQL或者Oracle,支持N种数据库。(N >= 10)

  2. 语法简单,如果有学习C和Perl的很容易上手,并且跟ASP有部分类似。有成熟的开发工具,比如NuPHPed,或者Zend Studio等等,再Linux平台下可以使用Eclipse等等。

  3. 目前主流技术都支持,比如WebService、Ajax、XML等等,足够应用。

  4. 有比较完整的支持,比如使用ADODB或者PEAR::DB做数据库抽象层,用Smarty或者smart template做模板层,如果是PHP 5.1的话,还能够使用PDO(PHP Data Object)来访问数据库。

  5. 有很多成熟的框架,比如支持MVC的框架:phpMVC,支持类似ASP.net的事件驱动的框架:Prado,支持类似Ruby On Rails的快速开发的框架:Cake等等,足够满足你的应用需求。

  6. PHP 5已经有成熟的面向对象体系,能够适应基本的面向对象要求。适合开发大型项目。

  7. 有成熟的社区来支持PHP的开发,比如国内的CSDN,喜悦国际村等等。

  8. 目前已经很多大型应用都是使用PHP,比如淘宝网、Yahoo、163、Sina等等大型门户,很多选用PHP来作为他们的开发语言,所以大型门户都能够选用它,我想足够能够你的使用了。

  PHP的缺点:

  1. 代码重用率有待提高,当然,这个跟面向对象有关系。其实PHP 5已经比较适意了。

  2. PHP程序员较少 (这个算php的缺点嘛,呵呵~)

<


  最近遇到要使用PHP访问WebService。问了一下PHP程序员,用过的人少。自己配置。
  在XP上配置不成功,在Win2003上安装一个5.2,安装时记得选择支持Soap。安装完后把IIS里解释PHP的DLL路径改正确。
  把PHP.ini文件拷贝到Windows目录下,把Soap的Dll文件php_soap.dll拷贝到System32目录下。重启IIS。新建一个PHP文件。
1/* soap.php */
2/* 连接的是C#实现的Webservice */
3$client = new SoapClient( http://xx.xxx.xx.com/service.asmx?wsdl );
4$client->YourFunctionName(
5array(
6  "Parameter1"=>"Value1",
7  "Parameter2"=>"Value2") );
8print $client->YourFunctionNameResult;
9
  这样就得到结果了。
  SoapClient语法详见php.net。用它也可以建立PHP的WebService。
本文来自: 中国自学编程网(www.zxbc.cn) 详细出处参考:http://www.zxbc.cn/html/phpjq/1212264662844.html
 




啊哈,终于用PHP实现了登录和注册拉,但是问题又来了,要求用ajax和php结合实现登录注册油烟机清洗
php登录源码:
下面是chklogin.php页面代码:
<?php
session_start();
$connect=mysql_connect("127.0.0.1","root","123");
if(!$connect)
{
die(''Could not connect: '' . mysql_error());
}
mysql_select_db(design,$connect);
$query="select * from ta_user where user_name =''".$name."''";
$result=mysql_query($query) OR die("Unable to connect to MySQL");
$rows=mysql_fetch_array($result);
if($rows[user_password]==$pwd)
{

header("Location:login_suss.php?name=".$name."");
}
else
{
echo "<table width=''235'' height=''61'' border=''0'' align=''center''>";
echo "<tr><td height=''29''>用户名或密码错误!</td></tr>";
echo "<tr><td height=''29''>请点击<a href=''javascrīpt:history.go(-1);''>这儿</a>重新输入!";
echo "</td></tr>";
echo "</table>";

}
?>

ajax:

<scrīpt language="javascrīpt">
function getXMLHTTPRequest()
{
var xRequest=null;
if (window.XMLHttpRequest)
{
xRequest=new XMLHttpRequest();
}
else if (typeof ActiveXObject != "undefined")
{
xRequest=new ActiveXObject("Microsoft.XMLHTTP");
}
return xRequest;
}
function Ajax(url)
{
AjaxObj = getXMLHTTPRequest();
AjaxObj.onreadystatechange = processRequest;
AjaxObj.open("post",url,true);
AjaxObj.setRequestHeader(''Content-type'',''application/x-www-form-urlencoded'');
AjaxObj.send("name"+name);

}
function processRequest()
{

if(AjaxObj.readyState == 4)
{
if(AjaxObj.status == 200)
{
if(AjaxObj.responseText != "")
{
document.getElementById("show").innerHTML="";
//alert(AjaxObj.responseText);

document.getElementById("show").innerHTML=AjaxObj.responseText;

}
}
else
{
alert("您所请求的页面有异常。
< 中文名称:PHP和MySQL Web开发_中文版
英文名称:SAMS PUBLISHING PHP AND MYSQL WEB DEVELOPMENT
版本:2005
发行时间:2005年
地区:美国
语言:普通话
简介


PHP 和 MySQL Web 开发,第三版 作者 Luke Welling, Laura Thomson

销量最好的 PHP 和 MySQL Web 开发教程已经升级,包括教学材料,编码都采用 MySQL 5, PHP 5 并且采用 PHP对象模型,你可以学习开发安全动态的WEB站点,整合和实现PHP脚本语言和MYSQL数据库系统。真实的例子和项目给你坚实的基础,开始制作你自己的WEB站点。

译者序
前言
作者简介
第一篇 使用PHP
第1章 PHP快速入门教程
第2章 数据的存储与检索
第3章 使用数组
第4章 字符串操作与正则表达式
第5章 代码重用与函数编写
第6章 面向对象的PHP
第7章 异常处理
第二篇 使用MySQL
第8章 设计Web数据库
第9章 创建Web数据库
第10章 使用MySQL数据库
第11章 使用PHP从Web访问MySQL数据库
第12章 MySQL高级管理
第13章 MySQL高级编程
第三篇 电子商务与安全性
第14章 运营一个电子商务网站
第15章 电子商务的安全问题
第16章 使用PHP和MySQL实现身份验证
第17章 使用PHP和MySQL实现安全事务
第四篇 PHP的高级技术
第18章 与文件系统和服务器的交互
第19章 使用网络函数和协议函数
第20章 日期和时间的管理
第21章 创建图像
第22章 在PHP中使用会话控制
第23章 其他有用的特性
第五篇 创建实用的PHP和MySQL项目
第24章 在大型项目中使用PHP和MySQL
第25章 调试
第26章 建立用户身份验证机制和个性化设置
第27章 创建一个购物车
第28章 创建一个内容管理系统
第29章 创建一个基于Web的电子邮件服务系统
第30章 创建一个邮件列表管理器
第31章 创建一个Web论坛
第32章 生成PDF格式的个性化文档
第33章 使用XML和SOAP来连接Web服务
第六篇 附录
附录A 安装PHP及MySQL
附录B Web资源 

<
[!--infotagslink--]

相关文章

  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • index.php怎么打开?如何打开index.php?

    index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • PHP编程 SSO详细介绍及简单实例

    这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
  • PHP实现创建以太坊钱包转账等功能

    这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20
  • php微信公众账号开发之五个坑(二)

    这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
  • ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单

    首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31
  • PHP如何通过date() 函数格式化显示时间

    这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13
  • PHP+jQuery+Ajax实现多图片上传效果

    今天我给大家分享的是在不刷新页面的前提下,使用PHP+jQuery+Ajax实现多图片上传的效果。用户只需要点击选择要上传的图片,然后图片自动上传到服务器上并展示在页面上。...2015-03-15
  • golang与php实现计算两个经纬度之间距离的方法

    这篇文章主要介绍了golang与php实现计算两个经纬度之间距离的方法,结合实例形式对比分析了Go语言与php进行经纬度计算的相关数学运算技巧,需要的朋友可以参考下...2016-07-29
  • PHP如何使用cURL实现Get和Post请求

    这篇文章主要介绍了PHP如何使用cURL实现Get和Post请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-11
  • 谈谈PHP中相对路径的问题与绝对路径的使用

    经常看到有人踩在了PHP路径的坑上面了,感觉有必要来说说PHP中相对路径的一些坑,以及PHP中绝对路径的使用,下面一起来看看。 ...2016-08-24
  • thinkPHP中多维数组的遍历方法

    这篇文章主要介绍了thinkPHP中多维数组的遍历方法,以简单实例形式分析了thinkPHP中foreach语句的使用技巧,需要的朋友可以参考下...2016-01-12
  • PHP正则表达式过滤html标签属性(DEMO)

    这篇文章主要介绍了PHP正则表达式过滤html标签属性的相关内容,实用性非常,感兴趣的朋友参考下吧...2016-05-06
  • php构造方法中析构方法在继承中的表现

    这篇文章主要为大家详细介绍了php构造方法中析构方法在继承中的表现,感兴趣的小伙伴们可以参考一下...2016-04-15
  • jQuery+PHP+MySQL实现无限级联下拉框效果

    这篇文章主要介绍了jQuery+PHP+MySQL实现无限级联效果的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-02-21
  • php图片添加文字水印实现代码

    这篇文章主要为大家详细介绍了php图片添加文字水印实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-03-17
  • php有序列表或数组中删除指定的值的实现代码

    这篇文章主要介绍了php有序列表或数组中删除指定的值的实现代码,删除给定的值之后,得到一个新的有序列表,长度-1,下面是具体的实现方法...2021-08-22
  • PHP简单实现生成txt文件到指定目录的方法

    这篇文章主要介绍了PHP简单实现生成txt文件到指定目录的方法,简单对比分析了PHP中fwrite及file_put_contents等函数的使用方法,需要的朋友可以参考下...2016-04-28