显示标签为“php”的博文。显示所有博文
显示标签为“php”的博文。显示所有博文

2013年7月23日星期二

phpMyAdmin安全配置

第一种方法
xampp下通过修改phpmyadmin访问路径,增强安全性。
1、phpmyadmin 下修改 config.inc.php 添加
$cfg['PmaAbsoluteUri'] = ‘http://localhost/sunMyAdmin’;
其中,sunMyAdmin为修改后的phpmyadmin路径
2、修改 xampp\apache\conf\extra\httpd-xampp.conf
Alias /phpmyadmin “D:/xampp/phpMyAdmin/”  改为
Alias /sunmyadmin “D:/xampp/phpMyAdmin/”
其中,sunMyAdmin为修改后的phpmyadmin路径
其下的directory改为
<Directory “D:/xampp/phpMyAdmin”>
       AllowOverride None
       Order deny,allow
       Deny from all
       Allow from localhost
</Directory>
设置只允许本地访问

第二种方法
未经配置的phpMyAdmin很不安全,容易受到攻击,或者根本无法正常使用,phpMyAdmin有3种授权模式:
  • cookie: 显示一个web登录页面,输入mysql的用户名和密码,然后进入管理界面
  • http: 显示1个windows登录框,输入mysql的用户名和密码,然和进入管理
  • config: 把mysql用户名和密码直接填入config.inc.php,不显示登录界面,直接进入管理界面
phpMyAdmin的配置文件名为config.inc.php,各版本的config.inc.php修改方法如下:
  • 2.6以前版本:将config.inc.sample.php改为config.inc.php
  • 2.7版本:将config.default.php改为config.inc.php
  • 2.8版本:用配置脚本 ‘/script/setup.php’生成配置文件,生成的文件拷贝下来,手动存为config.inc.php
 config.inc.php配置脚本
2.8以上版本提供的配置脚本

一、使用cookie授权模式
将'auth_type'改为'cookie',然后修改'blowfish_secret'用一个任意字符串作为cookie的加密字符串,如果没有加密钥匙,系统会显示"配置文件现在需要绝密的短语密码(blowfish_secret) " ,配置文件如下:
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['blowfish_secret'] = '44e2f5aece2855.93921574';
修改完毕后,登录窗口入下
phpMyAdmin登录(cookie模式)
http授权模式的web登陆页面

二、使用config授权模式
   config需要这几个参数:
$cfg['Servers'][$i]['auth_type'] = 'config';  //授权模式
$cfg['Servers'][$i]['user'] = 'root';         //mysql登陆用户
$cfg['Servers'][$i]['password'] = '12345';    //mysql登陆用户密码

三、用http授权模式
$cfg['Servers'][$i]['auth_type'] = 'http';
http授权模式的登陆窗口
http授权模式的登陆窗口

注意事项:如果mysql服务器端采用了4.1以上版本,而客户端连接用的是mysql4.1一下版本,对用户设置密码时注意使用OLD_PASSWORD函数,举例:
  • mysql > SET PASSWORD = OLD_PASSWORD('12345');
  • mysql > 

2013年7月17日星期三

PHP跳转页面的三种方式



PHP页面跳转一、header()函数
header()函数是PHP中进行页面跳转的一种十分简单的方法。header()函数的主要功能是将HTTP协议标头(header)输出到浏览器。
header()函数的定义如下:
void header (string string [,bool replace [,int http_response_code]])
可选参数replace指明是替换前一条类似标头还是添加一条相同类型的标头,默认为替换。
第二个可选参数http_response_code强制将HTTP相应代码设为指定值。 header函数中Location类型的标头是一种特殊的header调用,常用来实现页面跳转。注意:1.location和“:”号间不能有空格,否则不会跳转。
2.在用header前不能有任何的输出。
3.header后的PHP代码还会被执行。例如

PHP页面跳转二、Meta标签
Meta标签是HTML中负责提供文档元信息的标签,在PHP程序中使用该标签,也可以实现页面跳转。若定义http-equiv为refresh,则打开该页面时将根据content规定的值在一定时间内跳转到相应页面。若设置content="秒数;url=网址",则定义了经过多长时间后页面跳转到指定的网址。
< meta http-equiv="refresh" content="1;url=http://blog.csdn.net/abandonship"> 
例,以下程序meta.php实现在该页面中停留一秒后页面自动跳转。
PHP页面跳转三、JavaScript

2013年6月18日星期二

PHPMailer 发送邮件(含详细介绍及使用方法说明)



上篇文章PHP mail()方法发送邮件部分邮箱无法收到邮件问题提到要介绍一下phpmailer这款免费开源的php 邮件程序,下面我们来看看吧,以下资料全部来自phpmailer官方网站:

PHPMailer 也是一个功能强大的邮件类

PHPMailer的主要功能特点:

支持邮件 s/mime加密的数字签名
支持邮件多个 TOs, CCs, BCCs and REPLY-TOs
可以工作在任何服务器平台,所以不用担心WIN平台无法发送邮件的问题的
支持文本/HTML格式邮件
可以嵌入image图像
对于邮件客户端不支持HTML阅读的进行支持
功能强大的发送邮件调试功能debug
自定义邮件header
冗余SMTP服务器支持
支持8bit, base64, binary, and quoted-printable 编码
文字自动换行
支持多附件发送功能
支持SMTP服务器验证功能
在Sendmail, qmail, Postfix, Gmail, Imail, Exchange 等平台测试成功
提供的下载文件中,包括内容详细的说明文档及示例说明,所以不用担心难于上手的问题!
PHPMailer 非常小巧、简单、方便、快捷
以上资料由Jiucool 翻译自phpmailer 官网,转载请注明!

PHPMailer的使用(这里以使用gmail smtp发送邮件为例,当然也支持sendmail  pop 等其他方式):

首先到http://phpmailer.worxware.com/ 下载最新版本的程序包
下载完成后,找到class.phpmailer.php 、class.smtp.php两个类放到自己的目录下!
然后新建一个php文件这里命名为:phpmail_jiucool.php
phpmail_jiucool.php内容如下:
我直接将邮件发送模块写成一个函数postmail_jiucool_com(),大家使用的时候直接调用该函数即可,函数内容为:

function postmail_jiucool_com($to,$subject = "",$body = ""){
    //Author:Jiucool WebSite: http://www.jiucool.com
    //$to 表示收件人地址 $subject 表示邮件标题 $body表示邮件正文
    //error_reporting(E_ALL);
    error_reporting(E_STRICT);
    date_default_timezone_set("Asia/Shanghai");//设定时区东八区
    require_once('class.phpmailer.php');
    include("class.smtp.php");
    $mail             = new PHPMailer(); //new一个PHPMailer对象出来
    $body             = eregi_replace("[\]",'',$body); //对邮件内容进行必要的过滤
    $mail->CharSet ="UTF-8";//设定邮件编码,默认ISO-8859-1,如果发中文此项必须设置,否则乱码
    $mail->IsSMTP(); // 设定使用SMTP服务
    $mail->SMTPDebug  = 1;                     // 启用SMTP调试功能
                                           // 1 = errors and messages
                                           // 2 = messages only
    $mail->SMTPAuth   = true;                  // 启用 SMTP 验证功能
    $mail->SMTPSecure = "ssl";                 // 安全协议
    $mail->Host       = "smtp.googlemail.com";      // SMTP 服务器
    $mail->Port       = 465;                   // SMTP服务器的端口号
    $mail->Username   = "SMTP服务器用户名";  // SMTP服务器用户名
    $mail->Password   = "SMTP服务器密码";            // SMTP服务器密码
    $mail->SetFrom('发件人地址,如admin#jiucool.com #换成@', '发件人名称');
    $mail->AddReplyTo("邮件回复地址,如admin#jiucool.com #换成@","邮件回复人的名称");
    $mail->Subject    = $subject;
    $mail->AltBody    = "To view the message, please use an HTML compatible email viewer! - From www.jiucool.com"; // optional, comment out and test
    $mail->MsgHTML($body);
    $address = $to;
    $mail->AddAddress($address, "收件人名称");
    //$mail->AddAttachment("images/phpmailer.gif");      // attachment
    //$mail->AddAttachment("images/phpmailer_mini.gif"); // attachment
    if(!$mail->Send()) {
        echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
        echo "Message sent!恭喜,邮件发送成功!";
        }
    }
当然还有更多、更详细的配置方式,大家可以自由发挥!

使用php发送电子邮件(phpmailer)

   在项目开发过程中,经常会用到通过程序发送电子邮件,例如:注册用户通过邮件激活,通过邮件找回密码,发送报表等。这里介绍几种通过PHP发送电子邮件的方式(1)通过mail()函数发送邮件(2)使用fsockopen方式连接smtp服务器发送(3)使用phpmailer邮件类发送。个人推荐使用phpmailer邮件类发送,phpmailer比较方便使用且功能强大,接下来对这几种方式分别做一下介绍。
        (1)通过mail()函数发送邮件
    PHP中的mail() 函数允许从脚本中直接发送电子邮件,格式:
    mail($to,$subject,$message,$headers,$parameters);
    to 必需。规定邮件的接收者。
    subject 必需。规定邮件的主题。该参数不能包含任何换行字符。
    message 必需。规定要发送的消息。
    headers 可选。规定额外的报头,比如 From(发件人), Cc(抄送) 以及 Bcc(密送)。
    parameters 可选。规定 sendmail 程序的额外参数。
         需要特别mail()函数用法相当简单,但并不我们使用mail()函数就可以直接发送邮件了,需要我们做一些配置,在Windows与Linux系统上的配置方式有些不同。我们发送邮件需邮件服务器,如果是Linux服务器需要在php.ini中的sendmail_path设置为服务器的路径,如果Linux在安装时安装了sendmail,可以这样设置:
    sendmail_path = /usr/sbin/sendmail
如果安装的是Qmail等其他Mail服务器则填写对应的路径即可。
如果是Windwos操作系统则需要配置SMTP和smtp_port着两个参数,例如:
    SMTP = localhost
    smtp_port = 25
如果将SMTP设置为localhost则本机必须安装邮件服务器才能正常发信,当然也可以设置其他邮件服务器的域名或IP地址,还有一个可选参数是sendmail_from可以设置默认的发件人邮箱。看一下php.ini的配置项:
使用mail函数时php.ini的配置
(2)使用fsockopen方式连接smtp服务器发送
首先需要有一个smtp邮件服务器,可以自己搭建也可以使用网易,新浪等免费的邮件服务器,发送的过程大致如下:
    1.建立TCP连接
    2.客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令,服务器端正希望以OK作为响应,表明准备接收
    3.客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行,服务器端则表示是否愿意为收件人接受邮件
    4.协商结束,发送邮件,用命令DATA发送
    目前绝大多数的服务商都提供SMTP服务,如果我们要使用的MTA需要用户认证(绝大多数的邮件服务商都需要认证)那就需要我们使用有效的用户名密码登陆。以网易的163邮箱为例,首先注册一个邮箱账号比如:mytest@163.com,这里我们使用一个写好的email.class.php来实现与SMTP服务器实现通信并发送邮件的功能,使用前需要在配置文件config.php中配置一下各项参数,详细说明可以参考附件中的示例代码。
(3)使用phpMailer邮件类发送电子邮件(特别推荐)
     先来几句废话:
    phpMailer是一个非常强大的php发送邮件类,可以设定发送邮件地址、回复地址、邮件主题、html网页,上传附件,并且使用起来非常方便。
     phpMailer的特点:
    1、在邮件中包含多个 TO、CC、BCC 和 REPLY-TO。
    2、平台应用广泛,支持的 SMTP 服务器包括 Sendmail、qmail、Postfix、Gmail、Imail、Exchange 等等。
    3、支持嵌入图像,附件,HTML 邮件。
    4、可靠的强大的调试功能。
    5、支持 SMTP 认证。
    6、自定义邮件头。
    7、支持 8bit、base64、binary 和 quoted-printable 编码。
    使用phpMailer发送邮件需要class.phpmailer.php和class.smtp.php两个文件,比较简单的代码片段:
  1. <?php
  2. require_once('./class.phpmailer.php');
  3. include_once("class.smtp.php");
  4. $mail = new PHPMailer(true); //实例化PHPMailer类,true表示出现错误时抛出异常
  5. $mail->IsSMTP(); // 使用SMTP
  6. try {
  7.   $mail->CharSet ="UTF-8";//设定邮件编码
  8.   $mail->Host       "smtp.163.com"// SMTP server
  9.   $mail->SMTPDebug  1;// 启用SMTP调试 1 = errors  2 =  messages
  10.   $mail->SMTPAuth   true;// 服务器需要验证
  11.   $mail->Port       25;//默认端口   
  12.   $mail->Username   "testuser"//SMTP服务器的用户帐号
  13.   $mail->Password   "testpwd";//SMTP服务器的用户密码
  14.   $mail->AddReplyTo('****@com133.com''回复'); //收件人回复时回复到此邮箱
  15.  $mail->AddAddress('****@test.com''李明'); //收件人如果多人发送循环执行AddAddress()方法即可 还有一个方法时清除收件人邮箱ClearAddresses()
  16. $mail->SetFrom('li1209@163.com''发件人');//发件人的邮箱
  17. $mail->Subject '这里是邮件的标题';
  18. $mail->Body '邮件内容';
  19. $mail->IsHTML(true);
  20.   $mail->Send();
  21.   echo "Message Sent OK";
  22. } catch (phpmailerException $e) {
  23.   echo $e->errorMessage();//从PHPMailer捕获异常
  24. } catch (Exception $e) {
  25.   echo $e->getMessage();
  26. }
  27. ?>
    如果使用phpMailer发送html网页只需添加代码:
  $body = file_get_contents('tpl.html'); //获取html网页内容
  $mail->MsgHTML(eregi_replace("[\]",'',$body));
注:使用MsgHTML()方法时发送的邮件内容不仅仅是html代码,而且可以将html代码中的图片等内容作为附件嵌入到页面中一起发送,这在发送图文并茂的信息时比较常用。并且使用该方法时无需对Body属性赋值也无需使用IsHTML()方法(即使使用也没有效果)。
    通过SSL安全连接发送邮件
    目前很多邮箱使用SLL加密方式连接发信,例如谷歌的GMAIL目前只支持加密连接,网易、腾讯等服务商目前也支持SLL加密方式连接。SSL协议端口号通常是465(具体视服务商而定),如果通过SSL方式发送邮件只需增加一个属性即可:
     $mail->SMTPSecure = "ssl";     
    同时端口号更改为SSL的端口号,例如:
     $mail->Port       = 465; 
    这样就可以通过SSL协议发送邮件了。
具体代码见附件:

又拍网架构 -- 前端PHP后台Python +消息中间件 RabbitMQ + 分库步骤

又拍网的服务器端开发语言主要是PHP和Python,其中PHP用于编写Web逻辑(通过HTTP和用户直接打交道), 而Python则主要用于开发内部服务和后台任务。 这是目前Web2.0公司的通用选项。

消息中间件:RabbitMQ
1.RabbitMQ: high performance messaging solution
3.通过消息中间件和云计算实现系统可伸缩性
5.RabbitMQ安装和测试小记


分库的一般阶段:
1. 一台主库和一台从库组成。 从库只用作备份和容灾,当主库出现故障时,从库就手动变成主库,一般情况下,从库不作读写操作(同步除外)。
2. 一台主库和多台从库。一些实时性要求不高的Query放到从库去执行。后面又通过添加多个从库来分流查询压力。
3. 随着数据量的增加,主库的写压力也越来越大,这是要拆库:
   3.1. 垂直拆分:是指按功能模块拆分,比如可以将群组相关表和照片相关表存放在不同的数据库中,这种方式多个数据库之间的表结构不同。
   3.2. 水平拆分:而水平拆分是将同一个表的数据进行分块保存到不同的数据库中,这些数据库中的表结构完全相同。
   3.3. 一般都会先进行垂直拆分,因为这种方式拆分方式实现起来比较简单,根据表名访问不同的数据库就可以了。

如何让Linux后台运行命令或php


用 telnet/ssh 登录Linux 服务器,运行了一些耗时较长的任务, 结果却因为关闭远程窗口任务中途失败。这是我们就需要用到Linux的后台运行命令
基础方法:下达的命令后面加上&,就可以使该命令在后台进行工作,这样做最大的好处就是不怕被ctrl+c这个中断指令所中断。可以通过执行fg来将其恢复到前台。有多个进程在后台运行,需要恢复到前台来执行的时候,就要可以用jobs列出所有在后台执行的进程,那个中括号([ ])里面的数字就是jobs代号,从而通过fg 数字恢复指定的后台进程.
进阶方法:以上方法只是把命令放入后台,他还是会跟远程窗口绑定在一起,一旦远程窗口关闭,这些后台运行的资源也会被释放,从而是任务终止,要想真正后台运行就需要用nohup
nohup php cli.php &
会有提示:
[~]$ appending output to nohup.out
运行成功,同时把程序运行的输出信息放到当前目录的 nohup.out 文件中去
这样就是真正的后台运行了

2013年6月14日星期五

RabbitMQ持久化的PHP使用示例

      在使用RabbitMQ时候想对消息进行持久化,一开始exchange和queue做了持久化设置setFlags(AMQP_DURABLE),重启rabbitmq-server后发现数据丢了。后来看官方手册里的publish方法里有delivery_mode、priority两个属性,delivery_mode:1非持久化,delivery_mode:2持久化,其中priority是设置消息优先级的可设置0-9级别,但是官方解释好像并未实现,测试中发现并未起作用。即使设置了持久化,也不能完全保证消息不丢失,比如RabbitMQ接受到消息后还没来得及写到磁盘就宕机了,那么就会有小概率的信息丢失。

具体使用示例如下:
<?php
//连接RabbitMQ
$conn_args = array('host' =>'localhost', 'port'=> '5672', 'login' =>'guest', 'password'=> 'guest', 'vhost' => '/');
$conn = new AMQPConnection($conn_args);
$conn->connect();

$channel = new AMQPChannel($conn);
$exchangeName = 'reported';
$queueName = 'request';
$queueKey = 'request_item';

if( isset($_GET['read']) ){ //读队列

$q = new AMQPQueue($channel);
$q->setName($queueName);
$q->setFlags(AMQP_DURABLE);
$messages = '';
try {
$q->bind($exchangeName, $queueKey);
$messages = $q->get(AMQP_AUTOACK); //消息获取
!empty($messages) && $messages = json_decode($messages->getBody(), true);
} catch (Exception $e) {
var_dump($e);
}
var_dump($messages);
$conn->disconnect();

}else{ //写队列

$ex = new AMQPExchange($channel);
$ex->setName($exchangeName);
$ex->setType(AMQP_EX_TYPE_TOPIC);
$ex->setFlags(AMQP_DURABLE); //exchange持久化
$ex->declare();

$q = new AMQPQueue($channel);
$q->setName($queueName);
$q->setFlags(AMQP_DURABLE); //queue持久化
$q->declare();
$q->bind($exchangeName, $queueKey);
$channel->startTransaction();
$message = array('content' => 'test','time' => time());

/**
* 消息持久化,delivery_mode:2持久化、delivery_mode:1非持久化,其中priority是设置消息的优先级,测试中发现并未起作用。
* 消息还有其他属性,请参考http://www.php.net/manual/zh/amqpexchange.publish.php
*/
$result = $ex->publish(json_encode($message), $queueKey, AMQP_NOPARAM, array('delivery_mode'=>2, 'priority'=> 9));
var_dump($result);
$channel->commitTransaction();
$conn->disconnect();
}

?>

2013年6月13日星期四

RabbitMQ官方中文入门教程(PHP版) 第四部分:路由(Routing)

路由(Routing)

前面的教程中,我们实现了一个简单的日志系统。可以把日志消息广播给多个接收者。
本篇教程中我们打算新增一个功能——使得它能够只订阅消息的一个字集。例如,我们只需要把严重的错误日志信息写入日志文件(存储到磁盘),但同时仍然把所有的日志信息输出到控制台中

绑定(Bindings)

前面的例子,我们已经创建过绑定(bindings),代码如下:
1$exchange->publish($message, '');
绑定(binding)是指交换器(exchange)和队列(queue)的关系。可以简单理解为:这个队列(queue)对这个交换器(exchange)的消息感兴趣。
绑定的时候可以带上一个额外的routing_key参数。为了避免与basic_publish的参数混淆,我们把它叫做binding key。以下是如何创建一个带binding key的绑定。
1$exchange->publish($message, $routeKey);
binding key的含义取决于交换器(exchange)的类型。我们之前使用过的fanout类型会忽略这个值。

Direct类型的交换器(exchange)

我们的日志系统广播所有的消息给所有的消费者(consumers)。我们打算扩展它,使其可以能够精确的过滤消息。例如我们也许值是希望当接收到一个严重的错误的时候才把消息写入磁盘,以免浪费磁盘空间。
我们使用的fanout类型的交换器(exchange)扩展性不够——它能做的仅仅是广播。
我们将会使用direct类型的交换器(exchange)来代替。路由的算法很简单——交换器将会对binding key和routing key进行精确匹配,从而确定消息该分发到哪个队列。
下图能够很好的描述这个场景:
在这个场景中,我们可以看到direct exchange X和两个队列绑定了。第一个队列使用orange作为binding key,第二个队列有两个绑定,一个使用black作为binding key,另外一个是green。
这样以来,当routing key为orange的消息发布到交换器(exchange),就会被路由到队列Q1。routing key为black或者green的消息就会路由到Q2。其他的所有消息都将会被丢弃。

多个绑定(Multiple bindings)

多个队列使用相同的binding key是合法的。我们的这个例子,我们可以添加一个X和Q1之间的绑定,使用blackbinding key。这样一来,direct交换器就和fanout交换器的行为一样,将会广播消息到所有匹配的队列。带有routing key为black的消息都会发送到Q1和Q2。

Emitting logs

我们将会发送消息到一个direct exchange,把日志级别作为routing key。这样子负责处理接收的脚本就可以选择它要处理的日志级别。我们先看看触发日志。
我们需要创建一个交换器(exchange):
1$exchange->setName('direct_logs');
然后我们发送一则消息:
1$exchange->publish($message, $severity);
我们先假设“severity”的值是info、warning、error中的一个。

订阅(Subscribing)

处理接收消息的方式和之前差不多,但是我们为每一个日志级别创建了一个新的绑定。
1foreach ($severities as $item) {
2$queue-&gt;bind($exchangeName, $item);
3}

整合

emit_log_direct.py的代码:
01<?php
02 
03/**
04 * PHP amqp(RabbitMQ) Demo-4
05 * @author  yuansir <yuansir@live.cn/yuansir-web.com>
06 */
07$severity = count($argv) > 2 ? $argv[1] : 'info';
08$message = empty($argv[2]) ? 'Hello World!' : ' ' . $argv[2];
09 
10$connection = new AMQPConnection(array('host' => '127.0.0.1', 'port' => '5672', 'vhost' => '/', 'login' => 'guest', 'password' => 'guest'));
11$connection->connect() or die("Cannot connect to the broker!\n");
12 
13$channel = new AMQPChannel($connection);
14$exchange = new AMQPExchange($channel);
15$exchange->setName('direct_logs');
16$exchange->setType(AMQP_EX_TYPE_DIRECT);
17$exchange->declare();
18 
19$exchange->publish($message, $severity);
20var_dump("[x] Sent $message");
21 
22$connection->disconnect();
receive_logs_direct.py的代码:
01<?php
02 
03/**
04 * PHP amqp(RabbitMQ) Demo-4
05 * @author  yuansir <yuansir@live.cn/yuansir-web.com>
06 */
07$exchangeName = 'direct_logs';
08 
09$connection = new AMQPConnection(array('host' => '127.0.0.1', 'port' => '5672', 'vhost' => '/', 'login' => 'guest', 'password' => 'guest'));
10$connection->connect() or die("Cannot connect to the broker!\n");
11$channel = new AMQPChannel($connection);
12$exchange = new AMQPExchange($channel);
13$exchange->setName($exchangeName);
14$exchange->setType(AMQP_EX_TYPE_DIRECT);
15$exchange->declare();
16$queue = new AMQPQueue($channel);
17$queue->setFlags(AMQP_EXCLUSIVE);
18$queue->declare();
19 
20$severities = $argv;
21$file = $severities[0];
22unset($severities[0]);
23if (!$severities) {
24        var_dump("Usage:$file [info] [warning] [error]");
25        exit();
26} else {
27        foreach ($severities as $item) {
28                $queue->bind($exchangeName, $item);
29        }
30}
31 
32var_dump('[*] Waiting for messages. To exit press CTRL+C');
33while (TRUE) {
34        $queue->consume('callback');
35}
36$connection->disconnect();
37 
38function callback($envelope, $queue) {
39        $msg = $envelope->getBody();
40        var_dump('[x]' . $envelope->getRoutingKey() . ':' . $msg);
41        $queue->nack($envelope->getDeliveryTag());
42}
如果你希望只是保存warning和error级别的日志到磁盘,只需要打开控制台并输入:
1$ php receive_logs_direct.php warning error &gt; logs_from_rabbit.log
如果你希望所有的日志信息都输出到屏幕中,打开一个新的终端,然后输入:
1$ php receive_logs_direct.php info warning error
2 [*] Waiting for logs. To exit press CTRL+C
如果要触发一个error级别的日志,只需要输入:
1$ php emit_log_direct.php error "Run. Run. Or it will explode."
2 [x] Sent 'error':'Run. Run. Or it will explode.'