- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试启动 Ratchet 的 chat-server.php 文件,该文件需要从 php 文件启动套接字服务器,以便每当客户端访问该页面时,服务器都会启动,但不会发生。这个 chat-server.php 文件需要从终端运行,但我试图在用户访问时从主页运行它。
文件结构
./index.php
./config.php
./vendor/(all vendor files)
./src/MyApp/Chat.php
./js/app.js
./inc/connect.php <--Database connection file
./inc/send-message.php
./inc/startServer.php
./inc/bg.php
./inc/serverStatus.txt
./css/index.css
./css/reset.css
./bin/chat-server.php
<?php
include_once ("./inc/startServer.php");
?>
<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;
if(isset($startNow)){
require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Chat()
)
),
8080
);
$server->run();
}
?>
<?php
$startNow = 1;
include_once ("../bin/chat-server.php");
?>
<?php
$statusFile = dirname(__FILE__).'/serverStatus.txt';
$status = file_get_contents($statusFile);
if($status == "0"){
function execInBackground($cmd) {
if(substr(php_uname(), 0, 7) == "WINDOWS") {
pclose(popen('start /B ' . $cmd, 'r'));
file_put_contents($statusFile, 1);
}
else {
exec($cmd . ' > /dev/null &');
file_put_contents($statusFile, 1);
}
}
execInBackground("php " . dirname(__FILE__) . "/bg.php");
}
最佳答案
当您使用 包含文件时相对路径 你必须记住它们是相对于 当前运行文件 ,不只是为了当前文件 .
在你的情况下。当您访问 index.php
并包括在其中 config.php
从那时起 startServer.php
没关系,因为你包括 ./inc/startServer.php
这是正确的,相对于 index.php
.
但比你包括 ../inc/serverStatus.txt
,这是不对的,因为你还在运行 index.php
并且该相对路径解析为 /../inc/serverStatus.txt
换句话说,您正试图访问比您的 DOCUMENT_ROOT
高一级的文件。 .所以你永远不会进入你的if
陈述。
您可以使用 __FILE__
始终解析为 的绝对路径的常量当前文件 .所以你可以改变你的$statusFile
到
$statusFile = dirname(__FILE__) . '/serverStatus.txt';
exec()
和
popen(pclose())
命令。如果你想执行一些不在你的
PATH
中的命令环境变量,比你
必须指定文件的绝对路径。因为你不知道它会从哪个文件夹启动。它可能是从
Apache
开始的主目录或者可能从您用户的主目录开始。这取决于您的
PHP
的设置是吗
sapi
模块还是它
fcgi
.无论如何,您需要更改您的
execInBackground()
到
execInBackground("php " . dirname(__FILE__) . "/bg.php");
pclose(popen('start /B ' . $cmd, 'r'));
exec($cmd . ' > /dev/null &');
<?php
$startNow = 1;
chdir(dirname(__FILE__));
include_once ("../bin/chat-server.php");
?>
PHP
会找到
chat-server.php
无论您从哪个文件夹运行它。
execInBackground()
.您的函数依赖于变量
$statusFile
, 但是这个变量定义在
全局范围并且在函数内部不可见。要使其可见,您必须包含声明
global $statusFile;
在访问
$statusFile
之前在您的函数中.像这样:
function execInBackground($cmd) {
global $statusFile;
if (false !== stripos(PHP_OS, 'win')) {
pclose(popen('start /B ' . $cmd, 'r'));
file_put_contents($statusFile, 1);
} else {
exec($cmd . ' > /dev/null &');
file_put_contents($statusFile, 1);
}
}
echo()
是一些日志功能。
exec()
,
popen()
出于同样的原因,类似。
关于php - 如何让脚本在后台运行 - 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38290749/
我是一名优秀的程序员,十分优秀!