Я работаю над веб-приложением, которое использует C ++ и PHP.Данная проблема связана с вызовом исполняемого файла CPP для создания сокета непосредственно перед подключением к нему файла PHP в качестве клиента.
Среда:
- CentOS7
- PHP 7.4 (Remi)
- Apache 2.4.6
- C ++ 11
Структура файла (немного сокращенно) выглядит следующим образом:
-- Project Title
|
|--- bin
|- compiled executables
|--- conf
|- ini configs
|--- deps
|--- cmake
|--- inih
|--- doc
|--- public
|--- assets
|--- branding
|--- symbols
|--- data
|--- lib (php)
|--- docs
|--- polyfills
|--- ui
|- websocket.php
|- controller.php
|- index.php
|--- src
|--- db
|--- doctypes
|--- sec
|- main.cpp
|- request.h
|- requestsocket.h
|--- test
|- unit tests
|- readme.md
|- cmakelists.txt
Apache работает как apache: bxwd, и все файлы принадлежат одному и тому же.Исполняемые файлы исполняются владельцем и группой.
Однако вызов исполняемого файла из php - будь то с помощью exec (), shell_exec () или system () - не работает, несмотря на то, что код работает, когдавызывается из командной строки.
Я провел некоторое тестирование, запустив
echo exec("whoami");
var_dump(file_exists('/var/www/html/project/bin/main'));
var_dump(is_executable('/var/www/html/project/bin/main'));
(при этом main является скомпилированным файлом C ++, который существует, который работает при вызове из командной строки).Интересно, что PHP может видеть файл, но is_executable возвращает false."Whoami" возвращает apache, как и ожидалось.
Я копаю в течение нескольких часов.Я испортил httpd.conf, php.ini и попытался вызвать файл несколькими разными способами.Я создал оболочки и привет-миры C ++ файлы, поместил их в тот же каталог, что и скрипт php, и все еще не повезло.
Независимо от того, что следующая строка не будет ничего делать (и не будет вызывать любой другой исполняемый файл C ++ или скрипт оболочки).
exec("/var/www/html/project/bin/main > /dev/null 2>&1");
Что мешает этому работать?