У меня проблема — я написал простое приложение на C ++, которое использует библиотеку OpenCV:
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
int faceDetect(string filename);
int main(int argc, const char** argv) {
int result = 0;
string filename(argv[1]);
Mat image = imread("C:/Serwer/Apache24/htdocs/image/upload/" + filename, 1);
if (image.empty()) {
return 101;
}
CascadeClassifier faceCascade;
if( !faceCascade.load("C:/Serwer/Apache24/htdocs/image/haarcascade_frontalface_alt2.xml") ){
return 103;
};
Mat imageGray;
std::vector<Rect> faces;
cvtColor(image, imageGray, CV_BGR2GRAY);
equalizeHist(imageGray, imageGray);
feCascade.detectMultiScale(imageGray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
for (size_t i = 0; i < faces.size(); i++) {
Rect face(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
rectangle(image, face, Scalar(195, 144, 212));
Mat faceROI = imageGray(faces[i]);
}
imwrite("C:/Serwer/Apache24/htdocs/image/result/" + filename, image);
return 1;
return result;
}
Когда я запускаю скрипт с cmd, все в порядке — файл результатов создается.
Я хотел бы использовать этот скрипт в моем веб-приложении (php + js + html), но когда я пытаюсь запустить его так:
<?php
$output = [];
$return = 0;
exec("test.exe lenna.png", $output, $return);
echo "return: " . $return . "<br>";
print_r($output);
?>
Файл не создан, $ return равен 255, а $ output — пустой массив. Я пытался добавить «2 &> 1 «в команде exec, но файл все еще не создан (но $ return равен 1). Я также пробовал другие функции php (system () и shell_exec ()), но он все еще не создал файл результатов.
Exe находится в той же директории, что и php скрипт (я пытался запустить его с абсолютным путем — все та же проблема). результат catalouge существует. В php.ini нет отключенных функций, в переменной path я вижу путь libs OpenCV. Когда я запускаю этот код:
<?php
echo "<pre>";
system("dir");
echo "</pre>";
?>
оно работает.
ОС: Win 8.1 x64
Apache 2.4.6 x64 (версия apachelounge)
PHP 5.6.13 x64 (fcgi_mod)
Есть идеи, что мне делать?
РЕДАКТИРОВАТЬ
Я обнаружил проблему — когда я запускаю PHP как mod_fcgid, мой cpp не работает. Когда я запускаю php как модуль apache (php5apache2_4.dll), все работает нормально.
Я получил мою текущую конфигурацию mod_fcgid отсюда: https://www.apachelounge.com/viewtopic.php?t=2394
И это выглядит так:
<IfModule fcgid_module>
FcgidIOTimeout 40
FcgidConnectTimeout 10
FcgidMaxProcesses 300
FcgidMaxProcessesPerClass 300
FcgidOutputBufferSize 64
ProcessLifeTime 0
FcgidMaxRequestsPerProcess 0
FcgidMinProcessesPerClass 0
FcgidFixPathinfo 0
FcgidProcessLifeTime 0
FcgidZombieScanInterval 20
FcgidMaxRequestLen 536870912
FcgidIOTimeout 120
FcgidTimeScore 3
FcgidPassHeader Authorization
FcgidInitialEnv PHPRC "C:\\Serwer\\PHP5"FcgidInitialEnv PATH "C:\\Serwer\\PHP5;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;"FcgidInitialEnv SystemRoot "C:\\Windows"FcgidInitialEnv SystemDrive "C:"FcgidInitialEnv TEMP "C:\\WINDOWS\\TEMP"FcgidInitialEnv TMP "C:\\WINDOWS\\TEMP"FcgidInitialEnv windir "C:\\WINDOWS"<Files ~ "\.php$">
Options Indexes FollowSymLinks ExecCGI
AddHandler fcgid-script .php
FcgidWrapper "C:/Serwer/PHP5/php-cgi.exe" .php
</Files>
</IfModule>
Нет ошибок в Apache error.log. Знаете ли вы, что я должен изменить в конфигурации fcgid для запуска внешнего приложения cpp?
Задача ещё не решена.
Других решений пока нет …