PHP fsockopen 异步写入文件

b.php


<?php $url = 'http://fsc.com/a.php'; $param = array( 'name'=>'fdipzone', 'gender'=>'male', 'age'=>30 ); doRequest($url, $param); echo "立马输出"; function doRequest($url, $param=array()){ $urlinfo = parse_url($url); $host = $urlinfo['host']; $path = $urlinfo['path']; $query = isset($param)? http_build_query($param) : ''; $port = 80; $errno = 0; $errstr = ''; $timeout = 10; $fp = fsockopen($host, $port, $errno, $errstr, $timeout); stream_set_blocking($fp,true);//开启了手册上说的非阻塞模式 stream_set_timeout($fp,1);//设置超时 $out = "POST ".$path." HTTP/1.1\r\n"; $out .= "host:".$host."\r\n"; $out .= "content-length:".strlen($query)."\r\n"; $out .= "content-type:application/x-www-form-urlencoded\r\n"; $out .= "connection:close\r\n\r\n"; $out .= $query; fputs($fp, $out); fclose($fp); /* //需要显示返回的信息,就用这个 fwrite($fp, $out); $content = ''; while (!feof($fp)) { $content .= fgets($fp); } fclose($fp); echo $content;//处理返回的信息 */ }

a.php

<?php
// 当执行过程中,客户端连接断开或连接超时,都会有可能造成执行不完整,因此需要加上
ignore_user_abort(true); // 忽略客户端断开 此处的代码需要php.ini开启相关的选项
set_time_limit(0);    // 设置执行不超时
$data = $_GET;
if(empty($data)){
    $data = $_POST;
}

$data['cont']= '延迟10秒写入,有上面的ignore函数在,网页客户端关闭网页,也可以照样执行';
$str = json_encode($data,JSON_UNESCAPED_UNICODE);
sleep(10);//模拟耗时任务
file_put_contents('./1.txt',$str);

打开上面的b.php   ,过10秒以后,a页面将接收到的东西写到1.txt里面,

打开b.php后,关闭页面也会执行异步写入操作,不会断开

posted @ 2019-08-22 14:00  御世制人  阅读(426)  评论(0编辑  收藏  举报