学院君 has written 676 articles

资深PHP工程师,Laravel学院院长

最佳实践系列(十一):深入探讨 PHP 错误异常处理机制及 Laravel 框架底层的相应实现

错误和异常是很强大的工具,能帮助我们预期意料之外的事,使用优雅的方式捕获问题。不过,错误和异常很相似,容易让人混淆,二者都表示出问题了,都会提供错误信息,而且都有错误类型。然而,错误出现的时间比异常早,错误会导致程序脚本停止执行,如果可能,错误会委托给全局错误处理程序处理,有些错误是无法恢复的。对于高版本 PHP 我们基本上只需要处理异常,不用管错误,但我们仍然必须做好防御准备,因为 P…

最佳实践系列(十):PHP 统一资源处理 API —— 流(Stream)的概述与使用详解

在现代 PHP 特性中,流或许是最出色但使用率最低的。虽然 PHP 4.3 就引入了流,但是很多开发者并不知道流的存在,因为人们很少提及流,而且流的文档也很匮乏。PHP 官方文档对流的解释如下: 流的作用是提供统一的公共函数来处理文件、网络和数据压缩等操作。简单而言,流是具有流式行为的资源对象,也就是说,流可以线性读写,并且可以通过 fseek() 之类的函数定位到流中的任何位置。 可能…

最佳实践系列(九):PHP 多字节字符串处理函数及字符编码

mbstring 扩展 我们所说的多字节字符指的是不在传统的 128 个 ASCII 字符集中的字符,比如中文字符。而 PHP 中处理字符串的函数默认假设所有字符都是 8 位字符,占用一个字节,如果使用这些 PHP 原生的字符串处理函数处理包含多字节字符的 Unicode 字符串,会得到意料之外的错误结果。 为了避免处理多字节字符出错,可以安装 mbstring 扩展。这个扩展提供了处理…

最佳实践系列(八):PHP 数据库统一处理 API —— PDO 扩展及其在 Laravel 底层的使用

PHP 支持多种数据库,如 MySQL、PostgreSQL、SQLite 和 Oracle 等,并且这些数据库都提供了用于 PHP 和相应数据库之间通信的扩展,如 mysqli、sqlite3 等。这样造成的一个问题是如果项目中使用了多种数据库,需要安装并使用多种 PHP 数据库扩展和接口,增加了学习和维护的成本。为此,从 PHP 5.1 开始引入了一个新的扩展 —— PDO。 PDO…

RabbitMQ 从入门到放弃系列笔记(八):远程调用(RPC)

在云计算环境中,很多时候需要用它其他机器的计算资源,把一部分计算任务分配到其他节点来完成。RabbitMQ 如何使用 RPC 呢?下面将会通过其它节点完成斐波纳契示例。 流程图  当客户端启动时,它创建了匿名的 callback queue 客户端发起 RPC 请求时将同时设置两个 properties:reply_to 设置为 callback queue;correlation_i…

RabbitMQ 从入门到放弃系列笔记(七):通过主题进行消息分发

Topic Exchange 对于 Message 的 routing_key 字符串格式是有限制的:以点号”.”分割的字符表,如php.laravel,并且长度不能超过 255 个字节。 对于 routing_key 而言,有两个特殊字符: *:代表任意单词 #:代表0个或多个单词  Topic Exchange 与其他 Exchange 的转化: routi…

RabbitMQ 从入门到放弃系列笔记(六):消息路由

如果我们只想让 error 级别的 log 保存到磁盘,该怎么做? emit_logs_direct.php <?php /** * 发送消息 */ $exchangeName = ‘direct_logs’; $level = empty($argv[1]) ? ‘info’ : $argv[1]; // 错误级别:info、warn、error $message = empty…

RabbitMQ 从入门到放弃系列笔记(五):消息订阅(Publish/Subscribe)

之前都是将消息发送到同一个 Consumer,而现在我们需将其发送到多个 Consumer。 我们将创建一个日志系统,它包含两个部分:第一个部分负责发出log(Producer),第二个部分负责接收并打印(Consumer)。我们将构建两个 Consumer,第一个将 log 写到物理磁盘上;第二个将 log 输出到屏幕。 “Fanout” not telling…

RabbitMQ 从入门到放弃系列笔记(四):消息分发机制

对于计算密集型任务,需要将其分发给多个消费者进行处理。 准备工作 我们对前面测试的代码稍作改造: task.php <?php /** * 分发任务 */ $exchangeName = ‘task’; $queueName = ‘worker’; $routeKey = ‘worker’; $message = empty($argv[1]) ? ‘Hello World!’ :…

RabbitMQ 从入门到放弃系列笔记(三):PHP 中实现消息发送和接收

send.php <?php /** * 发送消息 */ $exchangeName = ‘demo’; $routeKey = ‘hello’; $message = ‘Hello World!’; // 建立TCP连接 $connection = new AMQPConnection([ ‘host’ => ‘localhost’, ‘port’ => ‘5672’…