php推送数据流 php实现消息推送

接口如何通过PHP将文件以流的方式发送客户端1、在有模板php推送数据流的基础上,针对客户php推送数据流的定制下载 。
2、一些浏览器本身能够表示的文件类型(如txt文件),可以通过将头信息Content-Type改为 header("Content-Type: application/force-download");进行强制下载 。
3、对于一些动态生成文件,比如TXT/CSV等文件 , 将临时文件及时删除
?php
/**
* 本程序实现了将测试文件[test.pdf]创建副本,并将副本读入
* 内存,以流的方式发送给客户端浏览器,最终删除副本的操作 。
*
* 本文可以实现的需求php推送数据流:
*1、在有模板的基础上,针对客户的定制下载 。
*2、一些浏览器本身能够表示的文件类型(如txt文件),可以通过将头信息Content-Type
*改为 header("Content-Type: application/force-download");进行强制下载 。
*3、对于一些动态生成文件,比如TXT/CSV等文件,可以将临时文件及时删除
* @author Densin.Tian@CisternData 2015/05/05
*/
// 文件名扩展名
$fileExName = ".pdf";
// 原始文件文件名
$oldFileMainName = "testfile";
// 获得时间戳 YYYYMMDDHHMISS
$timestamp = date ( "YmdHis", time () );
// 新文件名
$newFileName = $oldFileMainName . $timestamp;

// 复制文件
【php推送数据流 php实现消息推送】if (! copy ( $oldFileMainName . $fileExName, $newFileName . $fileExName )) {
die ( "failed to copy" );
}
// 设置下载头信息
header ( "Content-Type: application/pdf" );
header ( "Content-Disposition: attachment; filename=20150505.pdf" );
// 文件流输出到浏览器
readfile ( $newFileName . $fileExName );
// 删除文件
@unlink ( $newFileFullName );
---------------------
PHP做HTTP接口如何做到主动推送信息事件触发php推送数据流的时候给目标网址发送数据就可以php推送数据流了php推送数据流,如果是定时推送就写个定时任务 。
使用 http_get($url) 或者用 curl 都可以发送数据 。具体使用就不多说了php推送数据流 , 百度很多 。
php中怎么用curl推送数据,每次推送一次直接基于curl发起请求就可以了,至于每次推送一次的需求,你可以通过定时去做 , 每次
只执行一遍即可 。
关于php curl更多内容,请参考我的博客《PHP cURL实现模拟登录与采集使用方法详解教程》
PHP curl 模拟表单数据流multipart/form-data上传文件在调用公众号接口".$token."type=".$type;
上传永久素材文件总是返回 "{\"errcode\":41005,\"errmsg\":\"media data missing\"}"
经过多次测试使用下面的方式,可以正常上传
//调用测试
protected static $url;
protected static $delimiter;
protected static $instance;
public function index()
{
static::$delimiter = uniqid();
$basename = Request::instance()-root();
if (pathinfo($basename, PATHINFO_EXTENSION) == 'php') {
$basename = dirname($basename);
}
$result=$this-wxAddMaterial($token,$basename.'/upload/images/gnlog.jpg','image');
}
// 新增其他类型永久素材
public function wxAddMaterial($token,$filename='',$type='') {
// 设置请求参数
static::$url = "".$token."type=".$type;
$filePath = str_replace('\\', '/', $filename);
// 发送请求
$imginfo=pathinfo($filePath);
$fields = array(
'media'=file_get_contents(".".$filePath),
'filename'=$imginfo["basename"],
);
$res = $this-putPart( $fields);
// 发送请求
return $res;
}
//推送文件流
public function putPart($param) {
$post_data = https://www.04ip.com/post/static::buildData($param);
$curl = curl_init(static::$url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($curl, CURLOPT_HTTPHEADER, [
"Content-Type: multipart/form-data; boundary=" . static::$delimiter,
"Content-Length: " . strlen($post_data)
]);
$response = curl_exec($curl);
curl_close($curl);
return $response;
}
//编译请求头格式和数据流
private static function buildData($param){
$datahttps://www.04ip.com/post/= '';
$eol = "\r\n";
$upload = $param['media'];
unset($param['media']);
foreach ($param as $name = $content) {
$data .= "--" . static::$delimiter . "\r\n"
. 'Content-Disposition: form-data; name="' . $name . "\"\r\n\r\n"
. $content . "\r\n";
}
$data .= "--" . static::$delimiter . $eol
. 'Content-Disposition: form-data; name="media"; filename="' . $param['filename'] . '"' . "\r\n"
. 'Content-Type:application/octet-stream'."\r\n\r\n";
$data .= $upload . "\r\n";
$data .= "--" . static::$delimiter . "--\r\n";
return $data;
}
根据自己的实际情况稍作修改
如何在php后端及时推送消息给客户端后端代码
push.php
?php
use Workerman\Worker;
require_once './Workerman/Autoloader.php';
// 初始化一个worker容器 , 监听1234端口
$worker = new Worker('websocket://0.0.0.0:1234');
// 这里进程数必须设置为1
$worker-count = 1;
// worker进程启动后建立一个内部通讯端口
$worker-onWorkerStart = function($worker)
{
// 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本 换行符
$inner_text_worker = new Worker('Text://0.0.0.0:5678');
$inner_text_worker-onMessage = function($connection, $buffer)
{
global $worker;
// $data数组格式,里面有uid,表示向那个uid的页面推送数据
$data = https://www.04ip.com/post/json_decode($buffer, true);
$uid = $data['uid'];
// 通过workerman , 向uid的页面推送数据
$ret = sendMessageByUid($uid, $buffer);
// 返回推送结果
$connection-send($ret ? 'ok' : 'fail');
};
$inner_text_worker-listen();
};
// 新增加一个属性,用来保存uid到connection的映射
$worker-uidConnections = array();
// 当有客户端发来消息时执行的回调函数
$worker-onMessage = function($connection, $data)use($worker)
{
// 判断当前客户端是否已经验证,既是否设置了uid
if(!isset($connection-uid))
{
// 没验证的话把第一个包当做uid(这里为了方便演示,没做真正的验证)
$connection-uid = $data;
/* 保存uid到connection的映射 , 这样可以方便的通过uid查找connection,
* 实现针对特定uid推送数据
*/
$worker-uidConnections[$connection-uid] = $connection;
return;
}
};
// 当有客户端连接断开时
$worker-onClose = function($connection)use($worker)
{
global $worker;
if(isset($connection-uid))
{
// 连接断开时删除映射
unset($worker-uidConnections[$connection-uid]);
}
};
// 向所有验证的用户推送数据
function broadcast($message)
{
global $worker;
foreach($worker-uidConnections as $connection)
{
$connection-send($message);
}
}
// 针对uid推送数据
function sendMessageByUid($uid, $message)
{
global $worker;
if(isset($worker-uidConnections[$uid]))
{
$connection = $worker-uidConnections[$uid];
$connection-send($message);
return true;
}
return false;
}
// 运行所有的worker(其实当前只定义了一个)
Worker::runAll();
启动后端服务
php push.php start -d
前端接收推送的js代码
var ws = new WebSocket('ws://127.0.0.1:1234');
ws.onopen = function(){
var uid = 'uid1';
ws.send(uid);
};
ws.onmessage = function(e){
alert(e.data);
};
后端推送消息的代码
// 建立socket连接到内部推送端口
$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1,STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT);
// 推送的数据,包含uid字段,表示是给这个uid推送
$data = https://www.04ip.com/post/array('uid'='uid1', 'percent'='88%');
// 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
fwrite($client, json_encode($data)."\n");
// 读取推送结果
echo fread($client, 8192);
这里的uid不一定是用户的id,也可以理解为任务id即 taskid
以上代码亲测可以直接使用
thinkphp怎样往电视上推送数据首先你要将电视盒子或者电视机的ADB打开,接着在电脑下载个电视应用安装器或者TV盒子助手 , 接着输入电视机的IP地址后连接成功 , 点击推送安装软件即可 。注:前提电脑和电视机/盒子必须在同一局域网内 。
php推送数据流的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于php实现消息推送、php推送数据流的信息别忘了在本站进行查找喔 。

    推荐阅读