分类 php 下的文章

在 CentOS 上下载和部署 RocketMQ 以及如何在 PHP 中使用它,可以分为以下几个步骤:

  1. 安装依赖

首先,确保你的 CentOS 系统是最新的,并安装必要的依赖。打开终端,执行以下命令:

#
bash
sudo yum update -y
sudo yum install java-1.8.0-openjdk-devel git -y
  1. 下载并安装 RocketMQ

接下来,下载 RocketMQ 的源代码并编译安装。这里以最新版本为例:

#
bash
# 克隆RocketMQ源码
git clone https://github.com/apache/rocketmq.git

# 切换到特定版本的分支,例如4.7.1,你可以根据需要选择其他版本
cd rocketmq
git checkout tags/v4.7.1 -b v4.7.1

# 编译RocketMQ
mvn -Prelease-all -DskipTests clean install -U

# 将编译好的二进制文件复制到安装目录,比如 /usr/local/rocketmq
sudo cp -r distribution/target/rocketmq-4.7.1/* /usr/local/rocketmq/
  1. 配置与启动 RocketMQ

配置环境变量(可选,方便管理):

#
bash
echo 'export ROCKETMQ_HOME=/usr/local/rocketmq' >> ~/.bashrc
echo 'export PATH=$PATH:$ROCKETMQ_HOME/bin' >> ~/.bashrc
source ~/.bashrc

启动 NameServer 和 Broker:

#
bash
nohup ${ROCKETMQ_HOME}/bin/mqnamesrv &>/dev/null &
sleep 5 # 等待NameServer启动完成

${ROCKETMQ_HOME}/bin/mqbroker -n localhost:9876 autoCreateTopicEnable=true &>/dev/null &
  1. 在 PHP 中使用 RocketMQ

要在 PHP 中使用 RocketMQ,你需要安装一个客户端库,例如 jmarranz/rocketmq-client-php(请注意,这个库可能不是非常活跃,你可能需要评估它的稳定性和适用性)。

首先,通过 Composer 安装该库:

#
bash
composer require jmarranz/rocketmq-client-php

然后,你可以编写 PHP 代码来生产和消费消息。以下是一个简单的示例:

#
php
<?php
require_once 'vendor/autoload.php';

use MQ\Client\Producer;
use MQ\Model\Message;

$producer = new Producer();
$producer->setNamesrvAddr('localhost:9876');
$producer->start();

$message = new Message('YourTopic', 'TagA', 'Hello RocketMQ');
$result = $producer->send($message, 3);

echo "Send result: ", ($result === null ? "OK" : "Failed"), "\n";

$producer->shutdown();

请根据实际情况调整代码中的 YourTopic 和其他参数。同时,考虑到生产环境中可能需要更复杂的配置和错误处理逻辑。

以上就是基本的 RocketMQ 在 CentOS 上的部署和在 PHP 中的简单使用方法。实际应用时,还需考虑安全性、高可用性配置等高级设置。

在 PHP 中,使用 foreach($result as &$v) 是一种通过引用遍历数组的方式,这意味着在循环体中,$v 实际上是对数组 $result 中当前元素的引用,而不是元素的副本。这种方式有时非常有用,特别是在你想要在循环内部修改原始数组元素时。然而,使用引用遍历也有一些潜在的缺点和隐患,包括:

1.意外的修改:由于 $v 是对原始数组元素的引用,因此在循环体中对 $v 的任何修改都会直接影响原始数组。这可能导致意外的副作用,特别是当循环逻辑复杂或涉及到多个数组时。

2.循环结束后的引用问题:在 foreach 循环结束后,$v 仍然保持对最后一个遍历到的元素的引用。如果稍后在代码中不小心修改了 $v,那么原始数组的最后一个元素也会被修改。这可能导致难以调试的问题,因为修改可能发生在远离原始 foreach 循环的代码位置。

3.可读性和维护性:使用引用遍历可能会降低代码的可读性和维护性。对于不熟悉该语法的其他开发人员来说,他们可能不容易理解 $v 对原始数组的影响。此外,如果在未来的代码修改中,某个开发者不知道或忘记了这一点,那么可能会引入新的错误。

4.内存使用:虽然使用引用遍历本身不会直接增加内存使用,但由于引用可能导致更复杂的内存访问模式,这可能在某些情况下影响性能。特别是在处理大量数据时,性能下降可能更加明显。

5.并发问题:在多线程或多进程环境中,如果多个线程或进程同时修改同一个数组,使用引用遍历可能导致数据竞争和不一致的结果。虽然 PHP 本身不是多线程的,但如果你在使用一些扩展或框架来实现并发,那么这个问题就可能变得重要。

为了避免这些潜在问题,建议谨慎使用引用遍历,并确保在循环结束后取消对最后一个元素的引用(通过将其设置为 null 或其他适当的值)。此外,如果可能的话,尽量使用值遍历(即不使用 &),除非你确实需要在循环内部修改原始数组。

以下是一个简单的shell脚本,用于开启或关闭swoole服务:

!/bin/bash

swoole服务器配置

HOST="127.0.0.1"
PORT=9501
WORKER_NUM=4

检查参数

if [ "$#" -ne 1 ]; then

echo "Usage: $0 {start|stop}"
exit 1

fi

开始/停止swoole服务器

case "$1" in

start)
    php /path/to/swoole_server.php $HOST $PORT $WORKER_NUM >/dev/null 2>&1 &
    echo "Swoole server started."
    ;;
stop)
    pkill -f "/path/to/swoole_server.php"
    echo "Swoole server stopped."
    ;;
*)
    echo "Usage: $0 {start|stop}"
    exit 1

esac
exit 0
在使用该脚本之前,请确保已经安装了php和swoole扩展。将上述代码保存为文件(例如,swoole.sh),并使用以下命令来运行它:

$ chmod +x swoole.sh # 将脚本设置为可执行权限
$ ./swoole.sh start # 启动swoole服务器
$ ./swoole.sh stop # 停止swoole服务器

在Swoole中,可以使用swoole_process类来创建子进程,然后在子进程中调用exit或者使用信号来关闭进程。如果是在Swoole的服务器环境中,可以使用swoole_server的相关方法来关闭服务器。

以下是一个简单的示例,展示如何在Swoole服务器脚本中安全地关闭服务器:

$server = new swoole_server("127.0.0.1", 9501);

$server->on('start', function ($server) {

echo "服务器启动";

});

$server->on('shutdown', function ($server) {

echo "服务器关闭";

});

$server->on('receive', function ($server, $fd, $reactor_id, $data) {

// 处理接收到的数据
$server->send($fd, "接收到数据:{$data}");

});

$server->start();
要关闭这个服务器,可以发送信号到主进程或者使用swoole_server的shutdown方法。

发送信号关闭的示例:

kill -USR1 ps aux | grep 'swoole' | grep master | awk '{print $2}'
在上述命令中,将ps aux | grep 'swoole' | grep master | awk '{print $2}'替换为获取你服务器主进程ID的正确命令。

使用swoole_server的shutdown方法关闭的示例:

// 假设你有一个管理Server对象的全局变量$server
$server->shutdown();
在实际的生产环境中,应该使用更加安全的方式来管理服务器的关闭,例如使用外部脚本来控制服务器的启动和关闭,或者使用进程管理工具如Supervisor来监控你的Swoole服务器进程。

swoole启动关闭方案
1.swoole如何在后台运行
(1)nohup php server.php & 或者 screen php server.php
(2)设置daemonize => 1时,程序将转入后台作为守护进程运行。长时间运行的服务器端程序必须启用此项

启用守护进程后,标准输入和输出会被重定向到log_file
如果未设置log_file,将重定向到/dev/null,所有打印屏幕的信息都会被丢弃
2.手动关闭swoole

先查看端口对应的进程 id

netstat -tunlp|grep 9501

结果 tcp 0 0 0.0.0.0:9400 0.0.0.0:* LISTEN 2750/php

再 kill 进程 id 就完事了

kill -9 2750

查看进程信息 (当然在 kill 之前查看)

ps -ef|grep 2750