我正在将 Nuxt 与 php-express 结合使用,我正在尝试测试我的 php 脚本,但错误持续了好几个小时,而且我找不到问题。
*服务器.cjs:*
const express = require("express");
const expressPhp = require("express-php");
const path = require("path");
const cors = require("cors");
const app = express();
app.use(cors());
const phpScriptsPath = path.join(__dirname, "/api-php");
const phpCgiPath = "/usr/local/bin/php-cgi";
app.use("/api-php", expressPhp.cgi(phpScriptsPath, phpCgiPath));
const port = process.env.PORT || 3001;
app.listen(port, () => {
console.log(`Serveur en cours d'exécution sur le port ${port}`);
});
php 在 MacOs 上使用 Homebrew 安装
which php-cgi
/usr/local/bin/php-cgi
php-cgi -v
PHP 8.3.3 (cgi-fcgi) (built: Feb 13 2024 15:41:14)
Copyright (c) The PHP Group
Zend Engine v4.3.3, Copyright (c) Zend Technologies
with Zend OPcache v8.3.3, Copyright (c), by Zend Technologies
**以及我面临的错误:**
Error: spawn php-cgi ENOENT
at ChildProcess._handle.onexit (node:internal/child_process:283:19)
at onErrorNT (node:internal/child_process:476:16)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
errno: -2,
code: 'ENOENT',
syscall: 'spawn php-cgi',
path: 'php-cgi',
spawnargs: []
}
我尝试使用 php.ini 创建 php 日志,但即使创建了文件并授予了完全权限,也不会在文件中放入任何错误日志。
我找到了 ENOENT 调试功能,这就是我得到的:
spawn called
[Arguments] {
'0': 'php-cgi',
'1': [],
'2': {
env: {
SERVER_SIGNATURE: 'NodeJS server at localhost',
PATH_INFO: '',
PATH_TRANSLATED: '',
SCRIPT_NAME: '/test.php',
SCRIPT_FILENAME: '/Users/satyr/Documents/Projet WEB/projet_web/api-php/test.php',
REQUEST_FILENAME: '/Users/satyr/Documents/Projet WEB/projet_web/api-php/test.php',
SCRIPT_URI: '/test.php',
URL: '/test.php',
SCRIPT_URL: '/test.php',
REQUEST_URI: '/test.php',
REQUEST_METHOD: 'POST',
QUERY_STRING: '',
CONTENT_TYPE: 'application/json',
CONTENT_LENGTH: '155',
AUTH_TYPE: '',
AUTH_USER: '',
REMOTE_USER: '',
ALL_HTTP: 'HTTP_HOST: localhost:3001\n' +
'HTTP_ACCEPT: application/json, text/plain, */*\n' +
'HTTP_SEC_FETCH-SITE: same-site\n' +
'HTTP_ACCEPT_LANGUAGE: fr-FR,fr;q=0.9\n' +
'HTTP_ACCEPT_ENCODING: gzip, deflate\n' +
'HTTP_SEC_FETCH-MODE: cors\n' +
'HTTP_CONTENT_TYPE: application/json\n' +
'HTTP_ORIGIN: http://localhost:3000\n' +
'HTTP_USER_AGENT: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15\n' +
'HTTP_REFERER: http://localhost:3000/\n' +
'HTTP_CONTENT_LENGTH: 155\n' +
'HTTP_CONNECTION: keep-alive\n' +
'HTTP_SEC_FETCH-DEST: empty\n',
ALL_RAW: 'host: localhost:3001\n' +
'accept: application/json, text/plain, */*\n' +
'sec-fetch-site: same-site\n' +
'accept-language: fr-FR,fr;q=0.9\n' +
'accept-encoding: gzip, deflate\n' +
'sec-fetch-mode: cors\n' +
'content-type: application/json\n' +
'origin: http://localhost:3000\n' +
'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15\n' +
'referer: http://localhost:3000/\n' +
'content-length: 155\n' +
'connection: keep-alive\n' +
'sec-fetch-dest: empty\n',
SERVER_SOFTWARE: 'NodeJS',
SERVER_NAME: 'localhost',
SERVER_ADDR: '127.0.0.1',
SERVER_PORT: 8011,
GATEWAY_INTERFACE: 'CGI/1.1',
SERVER_PROTOCOL: '',
REMOTE_ADDR: '::1',
REMOTE_PORT: '',
DOCUMENT_ROOT: '',
INSTANCE_ID: '',
APPL_MD_PATH: '',
APPL_PHYSICAL_PATH: '',
IS_SUBREQ: '',
REDIRECT_STATUS: 1,
HTTP_HOST: 'localhost:3001',
HTTP_ACCEPT: 'application/json, text/plain, */*',
'HTTP_SEC_FETCH-SITE': 'same-site',
HTTP_ACCEPT_LANGUAGE: 'fr-FR,fr;q=0.9',
HTTP_ACCEPT_ENCODING: 'gzip, deflate',
'HTTP_SEC_FETCH-MODE': 'cors',
HTTP_CONTENT_TYPE: 'application/json',
HTTP_ORIGIN: 'http://localhost:3000',
HTTP_USER_AGENT: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15',
HTTP_REFERER: 'http://localhost:3000/',
HTTP_CONTENT_LENGTH: '155',
HTTP_CONNECTION: 'keep-alive',
'HTTP_SEC_FETCH-DEST': 'empty'
}
}
}
Error: spawn php-cgi ENOENT
at ChildProcess._handle.onexit (node:internal/child_process:283:19)
at onErrorNT (node:internal/child_process:476:16)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
errno: -2,
code: 'ENOENT',
syscall: 'spawn php-cgi',
path: 'php-cgi',
spawnargs: []
}
我认为这个问题与
php-cgi
的生成过程有关。要排除并解决错误,您应按照以下步骤操作:
检查 php-cgi 路径: 确保
php-cgi
的路径正确。根据您提供的信息,路径似乎是/usr/local/bin/php-cgi
。仔细检查该路径以确保其正确。
验证 PHP-CGI 安装: 确认
php-cgi
二进制文件已安装且可访问。您可以通过在终端中运行以下命令来完成此操作:
which php-cgi
验证 PHP-CGI 版本: 检查
php-cgi
的版本,确保其安装正确且可访问。您可以通过在终端中运行以下命令来完成此操作:
php-cgi -v
检查权限: 确保运行 Node.js 服务器的用户具有访问
php-cgi
二进制文件并执行它的必要权限。
更新路径: 如果
php-cgi
的路径不正确,请将 phpCgiPath
文件中的 server.cjs
变量更新为正确的路径。