注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 

日志

 
 

PHP简单模拟多线程  

2010-04-09 13:22:00|  分类: Web技术-Php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
PHP简单模拟多线程

<?php
/**
 *Run
 *多线程机制
 */
function run($i)
{
    //连接服务器:注意如果你是以ssl/tls连接时,$host的值为:“ssl://www.example.com”即应加上"ssl://"前缀。
    //且$port值为443
    $host = $_SERVER ['HTTP_HOST'];
    $port = 80;
    $fp = fsockopen ( $host, $port, $errorno, $errormsg ); //连接服务器
    if (! $fp)
    {
        die ( "$errorno----------$errormsg" );
    } else
    {
        
        $i = "i=$i"; //传递的数据
        $path = '/test/create_file.php/'; //请求路径
        $method = 'POST'; //请求方法(POST方式)
        

        //HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递)。格式为:方法 路径/文件名 HTTP/1.1\r\n(协议版本)
        $post = "$method $path HTTP/1.1\r\n";
       //GET方式为:"GET /test/create_file.php?i HTTP/1.1\r\n";
        

        //Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。
        //HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。
        $post .= "HOST: {$_SERVER['HTTP_HOST']} \r\n";
        
        //Content-Type实体头用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型。
        $post .= "Content-type: application/x-www-form-urlencoded\r\n";
        
       //Content-length它指示HTTP体信息的长度(字节)。
        $post .= "Content-length: " . strlen ( $i ) . "\r\n";
        
        $post .= "Connection: Close\r\n\r\n";
        
        $post .= "$i\r\n"; //POST方式传递数据,在GET方式时,此处不要。
        fputs ( $fp, $post );
    }
    fclose ( $fp );
}

//触发多线程  
for($i = 0; $i <= 2; $i ++)
{
    run ( $i );
}


/*------------------------
fsockopen去请求服务器上的create_file.php文件,
create_file.php的代码为:

$i = $_POST['i'];//GET方式请求时为:$i = $_GET['i']
file_put_contents('d:s_'.$i.'_'.time().'.php',time());

我们可以看到三个文件是同时(几乎是同时,因为用microtime()函数,我们看到有微小的差异)被创建的。
*------------------------/


另:这里点小小的说明:使用fsockopen()时,分析完hostname并且建立一个成功的连接(或者延时$timeout秒)之前需要等待返回连接状态。而我们如果使用stream_socket_client()函数直接替换掉fsocketopen(),将不需要等待立刻返回。另外注意的是PHP需要解析$host,所以没有直接使用$ip更加明智。

stream_socket_client 版本:

function openPostSock($data,$host,$port,$path)
{

//$data=http_build_query($data);

//这里如果想让服务器以form表单形式获取数据,请

$fp =stream_socket_client('tcp://'.$host.':'.$port,$errno, $errstr, 3);
if($fp)
{
$out="POST $path HTTP/1.1\r\n";
$out.="Host: $host\r\n";
$out.="Content-type: application/json\r\n";//这里是MIME类型
$out.="Content-Length: " . strlen($data) . "\r\n";
$out.="Connection: close\r\n";
$out.="\r\n".$data."\r\n";
fwrite($fp, $out);
}
fclose($fp);
}




 ps:

《PHP的另类后台运行方式(AJAX header('Connection: close');)》

《关于PHP接收POST数据总结》

参:http://blog.sarabande.jp/post/80978348175
  评论这张
 
阅读(136)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017