如何修复错误:spawn php-cgi ENOENT

问题描述 投票:0回答:1

我正在将 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 node.js express nuxt.js
1个回答
0
投票

我认为这个问题与

php-cgi
的生成过程有关。要排除并解决错误,您应按照以下步骤操作:

  1. 检查 php-cgi 路径: 确保

    php-cgi
    的路径正确。根据您提供的信息,路径似乎是
    /usr/local/bin/php-cgi
    。仔细检查该路径以确保其正确。

  2. 验证 PHP-CGI 安装: 确认

    php-cgi
    二进制文件已安装且可访问。您可以通过在终端中运行以下命令来完成此操作:

    which php-cgi
    
  3. 验证 PHP-CGI 版本: 检查

    php-cgi
    的版本,确保其安装正确且可访问。您可以通过在终端中运行以下命令来完成此操作:

    php-cgi -v
    
  4. 检查权限: 确保运行 Node.js 服务器的用户具有访问

    php-cgi
    二进制文件并执行它的必要权限。

  5. 更新路径: 如果

    php-cgi
    的路径不正确,请将
    phpCgiPath
    文件中的
    server.cjs
    变量更新为正确的路径。

© www.soinside.com 2019 - 2024. All rights reserved.