如何解决phpresque视频任务拥堵 php

> 使用Redis+php-resque实现消息队列
一、Redis安装
1. 获取源码
shell># cd /usr/local/src
shell># wget http://download..io/releases/-2.6.16.tar.gz
shell># tar -zxvf -2.6.16.tar.gz
shell># cd -2.6.16
2. 编译、安装
shell># make
3. 配置Redis
编辑.conf文件
shell># vi /usr/local/src/-2.6.16/.conf
daemonize = yes
4. 启动Redis
shell># src/-server /usr/local/src/-2.6.16/.conf
5. 测试连接
shell># src/-cli
> set foo bar
1. 获取源码
shell># cd /usr/local/src
shell># wget /nicolasff//archive/2.2.3.tar.gz -O nicolasff--2.2.3.tar.gz
shell># tar -zxvf nicolasff--2.2.3.tar.gz
shell># cd -2.2.3
2. 编译、安装
shell># /usr/local//bin/ize
shell># ./configure –-with--config=/usr/local//bin/-config
shell># make && make install
3. 配置.ini
shell># vi /usr/local//etc/.ini
extension=.so
4. 重启nginx & -fpm
需要pcntl支持
shell># yum -y install git
安装Composer
shell># cd /usr/local/bin
shell># curl –sS https://getcomposer.org/installer |
shell># mv composer.ar /usr/local/bin/composer
disable_functions = … …
将proc_open和proc_get_status以及exec删除
保存后,重启LNMP
1. 获取源码
shell># cd /home/wwwroot/default
shell># git clone git:///chrisboulton/-.git
shell># cd -
shell># composer install
1. 一个Job
Job|任务:一个Job就是一个需要在后台完成的任务,比如邮件发送,就可以抽象为一个Job。在Resque中一个Job就是一个Class。
shell># cd -
shell># vim demo/job.
class PHP_Job
public function perform()
fwrite(STDOUT, 'Start job! -> ‘);
sleep(10);
fwrite(STDOUT, ‘Job ended!’ . PHP_EOL);
这个Job的具体任务:输出’Start job! ->’,然后等待10秒钟后,再次输出’Job ended!’。
在Resque的设计中,一个Job必须存在一个perform方法,Worker则会自动运行这个方法。
2. 将Job插入队列
Queue|队列:就是标题中的消息队列。在Resque中,队列由Redis来负责实现。Resque还提供了一个简单的队列管理器,可以实现将Job插入/取出队列等功能。
shell># vim demo/queue.
if(empty($argv[1]) or empty($argv[2])) {
die('Specify the name of a queue or job to add. e.g,
queue. default PHP_Job');
//在cli命令行中运行queue. 后面必须加上两个参数,第一个参数为queue的名称 第二个参数为job的名称,必须同之前编写的Job类的类名。
require __DIR__ . '/init.';
date_default_timezone_set('GMT');
Resque::setBackend('127.0.0.1:6379');
$args = array(
'time' => time(),
‘array’ => array(
‘test’ => ‘test’,
$jobId = Resque::enqueue($argv[1], $argv[2], $args, true);
echo “Queued job “.$jobId.”\n\n”;
在cli方式中运行:
demo/queue. default PHP_Job
结果可以在屏幕上看到输出:
Queued job 4ee7cefcb7df03ffa5bea
即Job添加入队列成功。
3. 查看Job运行情况
-同样提供了查看Job运行状态的例子,直接运行:
demo/check_status. 4ee7cefcb7df03ffa5bea
可以看到输出:
Tracking status of 10de12bc0d4e. Press [break] to stop.
Status of 4ee7cefcb7df03ffa5bea is: 1
Status of 4ee7cefcb7df03ffa5bea is: 1
Status of 4ee7cefcb7df03ffa5bea is: 1
我们刚才创建的Job运行状态为1。在Resque中,一个Job有以下4中状态:
Resque_Job_Status::STATUS_WAITING = 1; (等待)
Resque_Job_Status::STATUS_RUNNING = 2; (正在执行)
Resque_Job_Status::STATUS_FAILED = 3; (失败)
Resque_Job_Status::STATUS_COMPLETE = 4; (结束)
由于没有运行Worker,所以刚才创建的Job还是等待状态。
4. 运行Worker
shell># vim demo/.
date_default_timezone_set('GMT');
require 'job.';
require '../bin/';
可以看到一个Worker至少需要两部分:
1.可以直接包含Job类文件,也可以使用的自动加载机制,指定好Job Class所在路径并能实现自动加载。
2.包含Resque中默认的Worker: bin/
在cli方式下运行:
shell># QUEUE=default
前面的QUEUE部分是设置的环境变量,我们指定当前的Worker只负责处理default队列。也可以使用
shell># QUEUE=*
来处理所有的队列。
运行后,可以看到输出:
[notice] Starting worker s3:19060:default
[notice] Starting work on (Job{default} | ID: 4ee7cefcb7df03ffa5bea | PHP_Job | [{"time":,"array":{"test":"test"}}])
Start job! -> Job ended!
//Job的运行结果
[notice] (Job{default} | ID: 4ee7cefcb7df03ffa5bea | PHP_Job | [{"time":,"array":{"test":"test"}}]) has finished
使用ps指令检查一下:
shell># ps aux | grep
可以看到有一个的守护进程已经在运行了
0.6 68 pts/0
任务运行完毕后,同时屏幕可以看到输出结果!
至此利用Redis + -实现消息队列的演示全部完成。
5. 参考资料
/pages/run-background-task-by--
http://kamisama.me//background-jobs-with--and--part-1-introduction/PHP中如何执行shell命令-CSDN论坛
PHP中如何执行shell命令
&&&&&本人项目中需要用php来为使用者提供对server的可视化操作。
如:在web上启动某个performance进程,在某一时刻结束该进程,获取performance数据,画图展示在页面上。
此前,我对php调用shell命令做了一些调查:
1.&system();
2.&shell_exec();
3.popen(cmd,file);
本人使用system()做了一些小测验
echo&system("ls&-a");
echo&system("pwd");
等等,执行结果均能够正常显示在web页面。
但是,当我执行一个不能立即结束的命令时:比如system(open&eclipse);的操作时,能够返回一些log信息,但是通过jps却看不到eclipse的进程。
而我的performance也是需要长时间运行的,如何解决这个问题。
之前考虑过popen创建一个子进程,但是还没有搞定。
请大家指教。
执行结束后&将结果写到一个文件里,前端&JS&&定时刷新页面读取这个文件的内容输出...
引用&1&楼&PhpNewnew&的回复:执行结束后&将结果写到一个文件里,前端&JS&&定时刷新页面读取这个文件的内容输出...
你的意思是把log重定向么?
比如system("top&-b&-d&1&-n&100&&&/root/top.log“);&输出top&信息,每次间隔1s,输出100次,重定向到top.log。但是我运行完没有看到top.log。
这是测试代码:
&!DOCTYPE&html&
echo&"host&name:&";
echo&shell_exec('uname&-n');
echo&"&br&";
&?php&echo&$_GET["PERF_HOME"];&echo&"&br&";&?&
&?php&echo&$_GET["TIME_SPAN"];&echo&"&br&";&?&
&?php&echo&$_GET["OUTPUT_HOME"];&echo&"&br&";&?&
&?php&echo&$_GET["DATABASE"];&echo&"&br&";&&?&
system("top&-b&-d&1&-n&100&&&/root/top.log");
难道您说的是用popen么?能详细一点么,php我接触的比较少
权限够&执行&&?php
system("top&-b&-d&1&-n&100&&&/root/top.log");
?&&&是没任何问题的,并且也正常的产生了日志文件.你的是centos吗?ubuntu&下&一切正常
问题描述的不够清楚,是这样的,我希望通过php启动一个异步的linux进程来执行我的任务,我只需要拿到进程pid就好了。如何实现
引用&3&楼&PhpNewnew&的回复:权限够&执行&&?php
system("top&-b&-d&1&-n&100&&&/root/top.log");
?&&&是没任何问题的,并且也正常的产生了日志文件.你的是centos吗?ubuntu&下&一切正常
我的是centos&6.5,&我在ubuntu&12.0LTS上跑,为啥浏览器直接下载.php文件了?
引用&5&楼&yjjy0921&的回复:Quote: 引用&3&楼&PhpNewnew&的回复:
权限够&执行&&?php
system("top&-b&-d&1&-n&100&&&/root/top.log");
?&&&是没任何问题的,并且也正常的产生了日志文件.你的是centos吗?ubuntu&下&一切正常
我的是centos&6.5,&我在ubuntu&12.0LTS上跑,为啥浏览器直接下载.php文件了?
引用&5&楼&yjjy0921&的回复:Quote: 引用&3&楼&PhpNewnew&的回复:
权限够&执行&&?php
system("top&-b&-d&1&-n&100&&&/root/top.log");
?&&&是没任何问题的,并且也正常的产生了日志文件.你的是centos吗?ubuntu&下&一切正常
我的是centos&6.5,&我在ubuntu&12.0LTS上跑,为啥浏览器直接下载.php文件了?
root@wcao-OptiPlex-380:/var/www#&php&-version
PHP&5.3.10-1ubuntu3.13&with&Suhosin-Patch&(cli)&(built:&Jul&&7&:09)&
Copyright&(c)&&The&PHP&Group
Zend&Engine&v2.3.0,&Copyright&(c)&&Zend&Technologies
引用&5&楼&yjjy0921&的回复:Quote: 引用&3&楼&PhpNewnew&的回复:
权限够&执行&&?php
system("top&-b&-d&1&-n&100&&&/root/top.log");
?&&&是没任何问题的,并且也正常的产生了日志文件.你的是centos吗?ubuntu&下&一切正常
我的是centos&6.5,&我在ubuntu&12.0LTS上跑,为啥浏览器直接下载.php文件了?
直接下载PHP文件&说明你的WEB&服务端并没有正常的搭建起来...
引用&7&楼&PhpNewnew&的回复:直接下载PHP文件&说明你的WEB&服务端并没有正常的搭建起来...
恩,ubuntu上装了php,&apache2没有重启,重启后就正常了。
还是那个问题啊,如果是jsp的话我倒是可以new&Thread(runnable)这种方式去启动一个进程,但是php里不知道咋整唉
我找到解决办法了,
用这个框架可以处理request的后台任务。
给你推荐一个Linux/Unix&命令行工具的包:
require&'ShellWrap.php';
use&\MrRio\ShellWrap&as&&
//列出当前文件下的所有文件
echo&sh::ls();&
//检出一个git分支
sh::git('checkout',&'master');&
//你也可以通过管道把一个命令的输出用户另一个命令
//下面通过curl跟踪位置,然后通过grep过滤’html’管道来下载网站
echo&sh::grep('html',&sh::curl('',&array(
&&&&'location'&=&&true
//新建一个文件
sh::touch('file.html');&
//移除文件
sh::rm('file.html');&
//再次移除文件(这次失败了,然后因为文件不存在而抛出异常)
&&&&sh::rm('file.html');
}&catch&(Exception&$e)&{
&&&&echo&'Caught&failing&sh::rm()&call';
引用&10&楼&xuyanlu&的回复:给你推荐一个Linux/Unix&命令行工具的包:
require&'ShellWrap.php';
use&\MrRio\ShellWrap&as&&
//列出当前文件下的所有文件
echo&sh::ls();&
//检出一个git分支
sh::git('checkout',&'master');&
//你也可以通过管道把一个命令的输出用户另一个命令
//下面通过curl跟踪位置,然后通过grep过滤’html’管道来下载网站
echo&sh::grep('html',&sh::curl('',&array(
&&&&'location'&=&&true
//新建一个文件
sh::touch('file.html');&
//移除文件
sh::rm('file.html');&
//再次移除文件(这次失败了,然后因为文件不存在而抛出异常)
&&&&sh::rm('file.html');
}&catch&(Exception&$e)&{
&&&&echo&'Caught&failing&sh::rm()&call';
哇塞,好东西啊!虽然这个没法解决我提出的问题,非常感谢!
一个典型的重启网卡发给你参考下!!!
$handle&=&popen&(&"sudo&-u&\\#0&/sbin/service&network&restart&2&&1",&"r"&);
if&($handle)&{
$msg&=&"";
while&(&!&feof&(&$handle&)&)&{
$msg&.=&fgets&(&$handle,&1024&);
pclose&(&$handle&);
引用&10&楼&xuyanlu&的回复:给你推荐一个Linux/Unix&命令行工具的包:
require&'ShellWrap.php';
use&\MrRio\ShellWrap&as&&
//列出当前文件下的所有文件
echo&sh::ls();&
//检出一个git分支
sh::git('checkout',&'master');&
//你也可以通过管道把一个命令的输出用户另一个命令
//下面通过curl跟踪位置,然后通过grep过滤’html’管道来下载网站
echo&sh::grep('html',&sh::curl('',&array(
&&&&'location'&=&&true
//新建一个文件
sh::touch('file.html');&
//移除文件
sh::rm('file.html');&
//再次移除文件(这次失败了,然后因为文件不存在而抛出异常)
&&&&sh::rm('file.html');
}&catch&(Exception&$e)&{
&&&&echo&'Caught&failing&sh::rm()&call';
啊啊啊。。我二逼了。下载下来不会用啊。
git&clone&/MrRio/shellwrap
路径在:&/root/git/shellWrap
然后怎么把它安装到我的php库里去啊
我的php文件都放在/var/www目录下
在php里引用shellWrap,但是没用
require_once&'vendor/autoload.php';
use&MrRio\ShellWrap&as&
echo&sh::ls();
这个是神码意思?求指教!
回复YII2网站采集
php-resque 、FriendsOfPHP/Goutte
- 源码 - Yii Framework 中文社区
YII2网站采集
php-resque 、FriendsOfPHP/Goutte
6361次浏览
(1)、确定采集网站-&确定分类-&确定分页-&确定文章列表
(2)、将列表放入队列,确定队列处理函数(worker)
(3)、后台运行队列程序,当队列有内容的时候,就根据worker处理队列
(1)安装php-resque
详情:/chrisboulton/php-resque
(2)安装 FriendsOfPHP/Goutte
详情:/FriendsOfPHP/Goutte
(3)数据库 文章表(article)、采集表(gather)
3. 执行采集
(1)进入项目目录 cd /var/www/myYii
(2)查看队列程序(queue/run)有没有后台运行 pa aux |grey yi
(3)如果没有运行,则执行程序。QUEUE=* php yii queue/run &
(4)queue/run 会自动根据自定义处理类以及worker进行工作
( \Resque::enqueue('article_spider', 'console\models\ArticleJob',['category'=&$category,'url'=&$url,'className'=&$className,'publishTime'=&$publishTime]);)
4. 调用流程
php yii queue/run
调用 console\controllers\QueueController 中 actionRun方法,程序会根据队列内容以及队列处理函数自动采集文章&br/&
(2) php yii article/run yiichina
调用 console\controllers\ArticleController 中的 actionRun 方法,根据 $name 参数调用对应的网站采集类,此处调用 YiichinaSpider.php
(3)YiichinaSpider类中
先初始化网站信息,然后确定所有的采集分页(实例处理可能不合理,具体方法可以自己根据网站分页进行制定),然后整理每页的文章列表,最后把他们放入队列
(4)当队列中出现内容的时候
后台运行的队列函数(queue/run)会自动根据自己设定的处理类,此处是(‘console\models\ArticleJob’),对队列中数据进行处理。该类中必须有perform方法,QUEUE默认调用它处理队列数据
(5)队列处理
在ArticleJob中,先获取队列数据,然后插入采集内容,插入article表,最后存放采集记录
不错。学到了这个队列在yii中的使用方法
为什么不把程序代码打包一下,或者也使用composer来安装呀?
共 3 条回复
因为这里面没有多少核心代码,主要是有个采集程序和一个队列程序,这些东西都是github上现成的,没有必要专门打个包。
这也是为了以后更新方便吧,或者我想完善你的代码也说不定。放到GITHUB吧。一起来完善一下。
这些代码真心没有什么值得特别处理的必要,基本上就是对两个插件的简单应用。如果你想完善代码或者进行小项目,我也会很乐意参与进去。
感谢分享!!!!
(3)如果没有运行,则执行程序。QUEUE=* php yii queue/run &
如果出现 Error: Unknown command "queue/run".
补下,方便操作
(1)安装php-resque
(2)安装 FriendsOfPHP/Goutte
console\controllers\Controller文件在那?
是仅仅继承的yii\web\Controller,还是别的什么?
在采集https的网址时出现
GuzzleHttp\Exception\RequestException
cURL error 60: SSL certificate problem: unable to get local issuer certificate (see )
共 1 条回复
最后配置了下php.ini文件
curl.cainfo = "D:\AppServ\php5\cacert.pem" //这里填写自己对应的路径
并去拷贝了下面链接的代码,自己建了个文件在上面的路径上,文件名就是cacert.pem
重启apache,之后ok拉!
您需要登录后才可以评论。 |一、Redis安装1. 获取源码shell&# cd /usr/local/srcshell&# wget
shell&# tar -zxvf redis-2.6.16.tar.gzshell&# cd redis-2.6.162. 编译、安装shell&# make3. 配置Redis编辑redis.conf文件shell&# vi /usr/local/src/redis-2.6.16/redis.confdaemonize = yes4. 启动Redisshell&# src/redis-server /usr/local/src/redis-2.6.16/redis.conf5. 测试连接shell&# src/redis-cliredis& set foo barOKredis& get foo“bar”redis&二、phpredis 安装1. 获取源码shell&# cd /usr/local/srcshell&# wget
-O nicolasff-phpredis-2.2.3.tar.gzshell&# tar -zxvf nicolasff-phpredis-2.2.3.tar.gzshell&# cd phpredis-2.2.32. 编译、安装shell&# /usr/local/php/bin/phpizeshell&# ./configure –-with-php-config=/usr/local/php/bin/php-configshell&# make && make install3. 配置php.inishell&# vi /usr/local/php/etc/php.iniextension=redis.so4. 重启nginx & php-fpm三、php-resque安装*准备工作需要pcntl支持安装gitshell&# yum -y install git安装Composershell&# cd /usr/local/binshell&# curl –sS
| phpshell&# mv composer.phpar /usr/local/bin/composer修改 php.inidisable_functions = … …将proc_open和proc_get_status以及exec删除保存后,重启LNMP1. 获取源码shell&# cd /home/wwwroot/defaultshell&# git clone git:///chrisboulton/php-resque.git2. 安装shell&# cd php-resqueshell&# composer install四、Demo1. 一个JobJob|任务:一个Job就是一个需要在后台完成的任务,比如邮件发送,就可以抽象为一个Job。在Resque中一个Job就是一个Class。shell&# cd php-resqueshell&# vim demo/job.phpclass PHP_Job{public function perform(){fwrite(STDOUT, 'Start job! -& ‘);sleep(10);fwrite(STDOUT, ‘Job ended!’ . PHP_EOL);}}这个Job的具体任务:输出’Start job! -&’,然后等待10秒钟后,再次输出’Job ended!’。在Resque的设计中,一个Job必须存在一个perform方法,Worker则会自动运行这个方法。2. 将Job插入队列Queue|队列:就是标题中的消息队列。在Resque中,队列由Redis来负责实现。Resque还提供了一个简单的队列管理器,可以实现将Job插入/取出队列等功能。shell&# vim demo/queue.phpif(empty($argv[1]) or empty($argv[2])) {die('Specify the name of a queue or job to add. e.g, php queue.php default PHP_Job');//在cli命令行中运行queue.php 后面必须加上两个参数,第一个参数为queue的名称 第二个参数为job的名称,必须同之前编写的Job类的类名。}require __DIR__ . '/init.php';date_default_timezone_set('GMT');Resque::setBackend('127.0.0.1:6379');$args = array('time' =& time(),‘array’ =& array(‘test’ =& ‘test’,),);$jobId = Resque::enqueue($argv[1], $argv[2], $args, true);echo “Queued job “.$jobId.”\n\n”;在cli方式中运行:shell&# php demo/queue.php default PHP_Job结果可以在屏幕上看到输出:Queued job 4ee7cefcb7df03ffa5bea即Job添加入队列成功。3. 查看Job运行情况php-resque同样提供了查看Job运行状态的例子,直接运行:shell&# php demo/check_status.php 4ee7cefcb7df03ffa5bea可以看到输出:Tracking status of 10de12bc0d4e. Press [break] to stop.Status of 4ee7cefcb7df03ffa5bea is: 1Status of 4ee7cefcb7df03ffa5bea is: 1Status of 4ee7cefcb7df03ffa5bea is: 1我们刚才创建的Job运行状态为1。在Resque中,一个Job有以下4中状态:Resque_Job_Status::STATUS_WAITING = 1; (等待)Resque_Job_Status::STATUS_RUNNING = 2; (正在执行)Resque_Job_Status::STATUS_FAILED = 3; (失败)Resque_Job_Status::STATUS_COMPLETE = 4; (结束)由于没有运行Worker,所以刚才创建的Job还是等待状态。4. 运行Workershell&# vim demo/resque.phpdate_default_timezone_set('GMT');require 'job.php';require '../bin/resque';可以看到一个Worker至少需要两部分:1.可以直接包含Job类文件,也可以使用php的自动加载机制,指定好Job Class所在路径并能实现自动加载。2.包含Resque中默认的Worker: bin/resque在cli方式下运行:shell&# QUEUE=default php demo/resque.php前面的QUEUE部分是设置的环境变量,我们指定当前的Worker只负责处理default队列。也可以使用shell&# QUEUE=* php demo/resque.php来处理所有的队列。运行后,可以看到输出:[notice] Starting worker s3:19060:default[notice] Starting work on (Job{default} | ID: 4ee7cefcb7df03ffa5bea | PHP_Job | [{"time":,"array":{"test":"test"}}])Start job! -& Job ended! //Job的运行结果[notice] (Job{default} | ID: 4ee7cefcb7df03ffa5bea | PHP_Job | [{"time":,"array":{"test":"test"}}]) has finished使用ps指令检查一下:shell&# ps aux | grep resque可以看到有一个php的守护进程已经在运行了root
0.6 68 pts/0 S+ 06:12 0:01 php demo/resque.php任务运行完毕后,同时屏幕可以看到输出结果!至此利用Redis + php-resque实现消息队列的演示全部完成。5. 参考资料
如果您想留下此文,您可以将其发送至您的邮箱(将同时以邮件内容&PDF形式发送)
相关文章推荐
(Ctrl+Enter提交) &&
已有0人在此发表见解
&在& 01:12收藏到了
&&在信息爆炸的时代,您的知识需要整理,沉淀,积累!Lai18为您提供一个简单实用的文章整理收藏工具,在这里您可以收藏对您有用的技术文章,自由分门别类,在整理的过程中,用心梳理自己的知识!相信,用不了多久,您收藏整理的文章将是您一生的知识宝库!
· 蜀ICP备号-1

我要回帖

更多关于 php resque 安装 的文章

 

随机推荐