gpt4 book ai didi

php - 在 Debian 中将 PHP 脚本作为守护进程运行

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:33 26 4
gpt4 key购买 nike

我正在尝试在 Debian 中启动一个 php 脚本作为守护进程。我也希望它也能在启动时启动。

我已经开始使用 /path/to/php/path/to/script/Insert.php & 没有问题,并且可以 shell_exec("nohup/path/to/php/path/to/script/Insert.php >/dev/null &") 也是。我已尝试使用以下脚本,但它不会使脚本进入运行状态。

正在将文件复制到 /etc/init.d/ 并使用 update-rc.d 没有问题。我可以使用 service congen-insert start 来“启动”脚本,但它似乎并没有真正运行,也没有开始做任何工作。

我错过了什么,或者我的脚本哪里出了问题?

我知道有几种方法可以解决这个问题,但我真的只是想了解我做错了什么,或者为什么我做的事不起作用。

非常感谢任何帮助或建议!如果您还有其他需要或我在描述中遗漏的任何内容,请告诉我,以便我进行更正。

提前致谢。

服务脚本

#! /bin/sh
### BEGIN INIT INFO
# Provides: congen-insert
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: congen-insert
# Description: DB Insert Daemon
### END INIT INFO

NAME="congen-insert"
DESC=" DB Insert Daemon"
PIDFILE="/var/run/${NAME}.pid"
LOGFILE="/var/log/${NAME}.log"

DAEMON="/path/to/php"
DAEMON_OPTS="/path/to/script/Insert.php"

START_OPTS="--start --background --make-pidfile --pidfile ${PIDFILE} --exec ${DAEMON} ${DAEMON_OPTS}"
STOP_OPTS="--stop --pidfile ${PIDFILE}"

test -x $DAEMON || exit 0

set -e

case "$1" in
start)
echo -n "Starting ${DESC}: "
start-stop-daemon $START_OPTS >> $LOGFILE
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon $STOP_OPTS
echo "$NAME."
rm -f $PIDFILE
;;
restart|force-reload)
echo -n "Restarting $DESC: "
start-stop-daemon $STOP_OPTS
sleep 1
start-stop-daemon $START_OPTS >> $LOGFILE
echo "$NAME."
;;
status)
echo -n "Sorry, this isn't implemented yet"
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac

exit 0

我正在尝试运行的脚本:

const LoaderPath = __DIR__ . DIRECTORY_SEPARATOR . ".." .DIRECTORY_SEPARATOR . "includes.php";

require_once LoaderPath;

use PhpAmqpLib\Channel\AMQPChannel;
use PhpAmqpLib\Message\AMQPMessage;
use requests\InsertRequest;

$connection = GetRabbitConnection();

$channel = $connection->channel();

$RedisClient = GetRedisClient();

DeclareQueues($connection, $RedisClient);

$MySQLHost = $RedisClient->get(MySQLHostKey);
$MySQLUser = $RedisClient->get(MySQLUserKey);
$MySQLPassword = $RedisClient->get(MySQLPasswordKey);
$MySQLDatabase = $RedisClient->get(MySQLDatabaseKey);

$InsertExchange = $RedisClient->get(Insert.":".Exchange);
$InsertQueue = $RedisClient->get(Insert.":".Queue);
$Prefetch = $RedisClient->get(Insert.":".Prefetch);

$RedisClient->disconnect();
$RedisClient = null;

$mysql= new mysqli($MySQLHost, $MySQLUser, $MySQLPassword, $MySQLDatabase);

$channel->basic_qos(0,$Prefetch,false);

$channel->basic_consume($InsertQueue, $InsertExchange, false, false, false, false, "callback");


echo "Consuming on Exchange $InsertExchange with Queue $InsertQueue\n";

while(true) {
$channel->wait();
}

$channel->close();

function callback(AMQPMessage $message){
global $mysql;
echo "Message received", "\n";
$InsertRequest = new InsertRequest($message->body);

echo "Running Insert Statement\n";
if (!$mysql->query($InsertRequest->SQL)){
echo "Error: ".$mysql->error;
}

/** @type AMQPChannel $channel */
$channel = $message->delivery_info['channel'];
$channel->basic_ack($message->delivery_info['delivery_tag']);
echo "Insert Complete\n";

}

最佳答案

问题在于输出的重定向。我还修改了带有 bash header 的 php 文件,因此它不会在顶部显示为多个 php 进程,而是显示文件名:

修订后的服务脚本:

#! /bin/sh

### BEGIN INIT INFO
# Provides: congen-insert
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: congen-insert
# Description: ConGen DB Insert Daemon
### END INIT INFO

NAME="congen-insert"
DESC="DB Insert Process for ConGen"
PIDFILE="/var/run/${NAME}.pid"
LOGFILE="/var/log/${NAME}.log"

DAEMON="/var/congen/php/controllers/congen-insert"
DAEMON_OPTS="> /dev/null 2>&1"

START_OPTS="--start --background --make-pidfile --pidfile ${PIDFILE} --exec ${DAEMON} ${DAEMON_OPTS}"
STOP_OPTS="--stop --pidfile ${PIDFILE}"

test -x $DAEMON || exit 0

set -e

case "$1" in
start)
echo -n "Starting ${DESC}: "
start-stop-daemon $START_OPTS >> $LOGFILE
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon $STOP_OPTS
echo "$NAME."
rm -f $PIDFILE
;;
restart|force-reload)
echo -n "Restarting $DESC: "
start-stop-daemon $STOP_OPTS
sleep 1
start-stop-daemon $START_OPTS >> $LOGFILE
echo "$NAME."
;;
status)
echo -n "Sorry, this isn't implemented yet"
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac

exit 0

修改后的 PHP 脚本以运行:

#!/php52/php-5.6.6/bin/php
<?php
const LoaderPath = __DIR__ . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . "includes.php";

require_once LoaderPath;

use PhpAmqpLib\Channel\AMQPChannel;
use PhpAmqpLib\Message\AMQPMessage;
use requests\InsertRequest;

$connection = GetRabbitConnection();

$channel = $connection->channel();

$RedisClient = GetRedisClient();

DeclareQueues($connection, $RedisClient);

$InsertExchange = $RedisClient->get(Insert.":".Exchange);
$InsertQueue = $RedisClient->get(Insert.":".Queue);
$Prefetch = $RedisClient->get(Insert.":".Prefetch);

$RedisClient->disconnect();
$RedisClient = null;

$mysql= ConnectionBuilder::GetMySQLi();

$channel->basic_qos(0,$Prefetch,false);

$channel->basic_consume($InsertQueue, $InsertExchange, false, false, false, false, "callback");


echo "Consuming on Exchange $InsertExchange with Queue $InsertQueue\n";

while(true) {
$channel->wait();
}

$channel->close();

function callback(AMQPMessage $message){
global $mysql;
echo "Message received", "\n";
$InsertRequest = new InsertRequest($message->body);

echo "Running Insert Statement\n";
if (!$mysql->query($InsertRequest->SQL)){
echo "Error: ".$mysql->error;
}

/** @type AMQPChannel $channel */
$channel = $message->delivery_info['channel'];
$channel->basic_ack($message->delivery_info['delivery_tag']);
echo "Insert Complete\n";

}

将文件添加到 /etc/init.d/ 并使 php 脚本和服务脚本都可执行后,我可以使用 service congen-insert start 启动服务> 并像使用任何其他 init.d 服务一样使用其余命令。

应该注意的是,我将控制台重定向到 /dev/null,但您也可以通过将 /dev/null 替换为可写路径。

2>&1 的解释引用自another SO post "2 是 stderr(错误消息)的流编号,1 代表 [原文如此] stdout 流(标准非错误输出溪流)。”因此,我实际上是将 stdout 重定向到 /dev/null 并将 stderr 重定向到 stdout

关于php - 在 Debian 中将 PHP 脚本作为守护进程运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31108218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com