Изучаю пхп, там пишут что так не используют, но это важно знать как подключается cgi в пхп. Вот написал код. Код (Text): #include <iostream> #include <stdlib.h> using namespace std; void main(){ char *RemoteAddr = getenv("REMOTE_ADDR"); char *QueryString = getenv("QUARY_STRING"); cout<<"Content-type: text/html"<<endl<<endl; cout<<"<html><body>"; cout<<"<h>Здравствуйте! Мы знаем о Вас все!</h1>"; printf("Ваш IP-адрес: %s<br>",RemoteAddr); printf("Вот параметры, которые вы указали: %s", QueryString); cout<<"</body></html>"; cin.get(); } Скомпилировал программу, получил файл 1.exe, кинул этот файл возле файла index.php Далее там пишут вот такое, что пишут, на фото вложил. В файле index.php ничего не писал, там просто PHP: <?php echo 'Привет мир!'; ?> Не могу понять, что в браузере ввести чтоб вызвать методом GET эту программу написанную на С++. Когда ввожу так: http://test.ru/1.exe?a=1&b=2 происходит просто скачка файла 1.exe на компьютер, но не запуск cgi-программы(я так понял это называется любая программа написанная на ином языке, которую мы хотим запустить в браузере,верно?). Подскажите, как запустить программу 1.exe?
Сам не пробовал так, по-моему, нужно в конфиге апача добавить расширение exe в директиве AddHandler Код (Text): AddHandler cgi-script .cgi .pl .bat .exe Добавлено спустя 19 минут 18 секунд: Сейчас попробовал батник запустить, он только загружался, дописал строчку Код (Text): AddType cgi-script .bat и заработало. По-умолчанию у этих файлов майм-тип "application/x-msdownload", который должен только скачиваться. Видимо тебе нужно рядом написать Код (Text): AddType cgi-script .exe AddHandler cgi-script .cgi .pl .bat .exe А в параметрах директории, в которой запускается что-либо, нужно написать Код (Text): Options ExecCGI
Расскоментировал эту надстройку,перезапустил сервер и сделал как вы написали, затем попробовал написать в браузере http://test.ru/1.exe?a=1&b=2 происходит скачка программы 1.exe но не запуск этой программы Добавлено спустя 1 минуту 14 секунд: А эту строку AddType cgi-script .bat где вы написали? Options ExecCGI - это где именно писать?
Эти строчки рядом Код (Text): AddType cgi-script .exe AddHandler cgi-script .cgi .pl .bat .exe Options ExecCGI в настройках директории. Например, если физический адрес папки, в которой экзешник, c:/www/test, то Код (Text): <Directory "c:/www/test"> #тут могут быть и другие настройки типа AllowOverride или Allow Options ExecCGI </Directory>
Моя версия PHP Version 5.3.6 Код (Text): AddType cgi-script .exe AddHandler cgi-script .cgi .pl .bat .exe Вот это я прописал в C:\www\conf\httpd.conf в файле httpd.conf А вот эти настройки я не понял где прописывать? Код (Text): <Directory "c:/www/test"> #тут могут быть и другие настройки типа AllowOverride или Allow Options ExecCGI </Directory> В том же файле продолжать?
Нужно сначала понять, по какому пути у тебя находится екзешник. Потом нужно посмотреть, что написано в описаниях директорий (Directory). Без этого советовать бесполезно. Всё, что нужно (наверное), я тебе показал. Остальное зависит от существующих настроек. И ещё, я не специалист по настройкам Апача, так что пользуйся советами на свою ответственность
Экзэшник у меня находится C:\www\htdocs\test.ru\www\1.exe там и лежит файл index.php сайт который запускает. В папке www где лежит апач по ссылке: C:\www\conf я нашел в файле такое <Directory "C:/www/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all </Directory> Дописать рядом ваше? <Directory "c:/www/test"> #тут могут быть и другие настройки типа AllowOverride или Allow Options ExecCGI </Directory> Тогда заработает?
Ниже других описаний директорий. В твоём случае так Код (Text): <Directory "C:/www/htdocs/test.ru/www"> #тут могут быть и другие настройки типа AllowOverride или Allow Options ExecCGI </Directory>
Апач находится у меня на диске С:\www Я зашел в C:\www\conf в файл httpd.conf Ввел там такое Код (Text): AddHandler cgi-script .cgi .pl .bat .exe AddType cgi-script .exe Затем зашел в C:\www\conf нашел файл просто httpd(текстовой) нашел там Код (Text): <Directory "C:/www/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all </Directory> и ввел ниже этого: Код (Text): <Directory "C:/www/htdocs/test.ru/www"> #тут могут быть и другие настройки типа AllowOverride или Allow Options ExecCGI </Directory> Ввожу такую ссылку: http://test.ru/1.exe?a=1&b=2 Опять скачивается файл 1.exe но не запускается
Апач перезапустил? Может ещё у тебя в описании виртуального хоста test.ru что-то написано? Надеюсь, завтра тебе ответят более продвинутые. Ушел спать.
нужно переименовать 1.exe в 1.cgi и положить в C:/www/cgi-bin, а затем запускать так: http://test.ru/cgi-bin/1.cgi?a=1&b=2
Переименовал и запустил http://test.ru/cgi-bin/1.cgi?a=1&b=2 Выдает ошибку: Код (Text): Not Found The requested URL /cgi-bin/1.cgi was not found on this server.
Вроде как папка cgi-bin должна быть на том же уровне, что и папка www для документов, чтобы к ней не было прямого доступа. ...htdocs\test.ru\cgi-bin\ ...htdocs\test.ru\www\ И будет работать только в том случае, если Апач настроен так. Обычно папка cgi-bin вообще лежит в папке с Апачем, а в конфиге должно быть прописано Код (Text): <IfModule alias_module> ScriptAlias /cgi-bin/ "путь_к/Apache/cgi-bin/" </IfModule> Ниже этих строк должны быть правила для папки cgi-bin Код (Text): <Directory "путь_к/Apache/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all </Directory> В эту папку и нужно положить скрипт. Не знаю, что за проблемы такие, у меня во всех вариантах работает батник. Может, у тебя строка Код (Text): LoadModule cgi_module modules/mod_cgi.so не раскомментирована?
Проверил LoadModule cgi_module modules/mod_cgi.so Она раскомментирована. Настройки которые вы подсказали указать вроде указанны, вот из файла скопировал. Код (Text): <IfModule alias_module> # # Redirect: Allows you to tell clients about documents that used to # exist in your server's namespace, but do not anymore. The client # will make a new request for the document at its new location. # Example: # Redirect permanent /foo http://localhost/bar # # Alias: Maps web paths into filesystem paths and is used to # access content that does not live under the DocumentRoot. # Example: # Alias /webpath /full/filesystem/path # # If you include a trailing / on /webpath then the server will # require it to be present in the URL. You will also likely # need to provide a <Directory> section to allow access to # the filesystem path. # # ScriptAlias: This controls which directories contain server scripts. # ScriptAliases are essentially the same as Aliases, except that # documents in the target directory are treated as applications and # run by the server when requested rather than as documents sent to the # client. The same rules about trailing "/" apply to ScriptAlias # directives as to Alias. # ScriptAlias /cgi-bin/ "C:/www/cgi-bin/" </IfModule> <IfModule cgid_module> # # ScriptSock: On threaded servers, designate the path to the UNIX # socket used to communicate with the CGI daemon of mod_cgid. # #Scriptsock logs/cgisock </IfModule> # # "C:/www/cgi-bin" should be changed to whatever your ScriptAliased # CGI directory exists, if you have that configured. # <Directory "C:/www/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all </Directory> Создал дополнительно папку cgi-bin на том же уровне, что и папка www для документов, чтобы к ней не было прямого доступа, как вы написали и скопировал туда 1.exe который я переименовал в 1.cgi затем. Нажал RESTART в Апаче. Ввожу в браузере http://test.ru/cgi-bin/1.cgi?a=1&b=2 Код (Text): Not Found The requested URL /cgi-bin/1.cgi was not found on this server.
В вашем случае экзешник (который переименовали в 1.cgi) нужно поместить в папку C:/www/cgi-bin/ По правилу Код (Text): ScriptAlias /cgi-bin/ "C:/www/cgi-bin/" запрос http://test.ru/cgi-bin/1.cgi?a=1&b=2 будет направлен в директорию C:/www/cgi-bin/
Аллилуйя, заработало! Спасибо! Скажите, а для каких возможностях используются cgi, какие проги пишутся примерно чтоб использовать cgi для пхп?
Примите поздравления. Если уже написана какая-то программа, выполняющая какое-либо полезное действие и выводящая отчет в консоль, то проще её модифицировать так, чтобы вывод был по правилам CGI со всеми заголовками в браузер, а не переписывать функционал на PHP. Если писать с нуля, то сейчас многие задачи можно решить с помощью PHP, т.к. он умеет подключаться к разным БД, лекго работает со строками, с файловой системой, выводит в браузер, что хочешь. Мне вот интересен вариант использования, чтобы программа по 3д визуализации выводила картинку в браузер. На PHP пока не выполнимо. Во флеше можно, но качество рендера не удовлетворяет.
То есть на С++, Java ничего не пишется для php? Если пишется, то что? Ещё момент, параметры 1 и 2 не подставляются почему в программу, не скажете почему? http://test.ru/cgi-bin/1.cgi?a=1&b=2 Выдает вот такое: Код (Text): Здравствуйте! Мы знаем о Вас все!Ваш IP-адрес: 127.0.0.1 Вот параметры, которые вы указали: (null) А параметры 1 и 2 не подставились почему-то.