За последние 24 часа нас посетили 73908 программистов и 1650 роботов. Сейчас ищут 1080 программистов ...

CGI внутри PHP

Тема в разделе "PHP для новичков", создана пользователем kilogram, 19 мар 2012.

  1. kilogram

    kilogram Активный пользователь

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Изучаю пхп, там пишут что так не используют, но это важно знать как подключается cgi в пхп.

    Вот написал код.
    Код (Text):
    1.  
    2. #include <iostream>
    3. #include <stdlib.h>
    4. using namespace std;
    5.  
    6. void main(){
    7.  
    8. char *RemoteAddr = getenv("REMOTE_ADDR");
    9. char *QueryString = getenv("QUARY_STRING");
    10. cout<<"Content-type: text/html"<<endl<<endl;
    11. cout<<"<html><body>";
    12. cout<<"<h>Здравствуйте! Мы знаем о Вас все!</h1>";
    13. printf("Ваш IP-адрес: %s<br>",RemoteAddr);
    14. printf("Вот параметры, которые вы указали: %s", QueryString);
    15. cout<<"</body></html>";
    16. cin.get();
    17. }
    Скомпилировал программу, получил файл 1.exe, кинул этот файл возле файла index.php
    Далее там пишут вот такое, что пишут, на фото вложил.
    В файле index.php ничего не писал, там просто
    PHP:
    1. <?php echo 'Привет мир!'; ?>
    Не могу понять, что в браузере ввести чтоб вызвать методом GET эту программу написанную на С++.
    Когда ввожу так: http://test.ru/1.exe?a=1&b=2
    происходит просто скачка файла 1.exe на компьютер, но не запуск cgi-программы(я так понял это называется любая программа написанная на ином языке, которую мы хотим запустить в браузере,верно?).

    Подскажите, как запустить программу 1.exe?
    [​IMG]
     
  2. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Сам не пробовал так, по-моему, нужно в конфиге апача добавить расширение exe в директиве AddHandler
    Код (Text):
    1. AddHandler cgi-script .cgi .pl .bat .exe
    Добавлено спустя 19 минут 18 секунд:
    Сейчас попробовал батник запустить, он только загружался, дописал строчку
    Код (Text):
    1. AddType cgi-script .bat
    и заработало. По-умолчанию у этих файлов майм-тип "application/x-msdownload", который должен только скачиваться.
    Видимо тебе нужно рядом написать
    Код (Text):
    1. AddType cgi-script .exe
    2. AddHandler cgi-script .cgi .pl .bat .exe
    А в параметрах директории, в которой запускается что-либо, нужно написать
    Код (Text):
    1. Options ExecCGI
     
  3. kilogram

    kilogram Активный пользователь

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Расскоментировал эту надстройку,перезапустил сервер и сделал как вы написали, затем попробовал написать в браузере
    http://test.ru/1.exe?a=1&b=2 происходит скачка программы 1.exe но не запуск этой программы

    Добавлено спустя 1 минуту 14 секунд:
    А эту строку AddType cgi-script .bat где вы написали?

    Options ExecCGI - это где именно писать?
     
  4. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Эти строчки рядом
    Код (Text):
    1. AddType cgi-script .exe
    2. AddHandler cgi-script .cgi .pl .bat .exe
    Options ExecCGI в настройках директории. Например, если физический адрес папки, в которой экзешник, c:/www/test, то
    Код (Text):
    1. <Directory "c:/www/test">
    2. #тут могут быть и другие настройки типа AllowOverride или Allow
    3. Options ExecCGI
    4. </Directory>
     
  5. kilogram

    kilogram Активный пользователь

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Моя версия PHP Version 5.3.6
    Код (Text):
    1. AddType cgi-script .exe
    2. AddHandler cgi-script .cgi .pl .bat .exe
    Вот это я прописал в C:\www\conf\httpd.conf в файле httpd.conf

    А вот эти настройки я не понял где прописывать?
    Код (Text):
    1. <Directory "c:/www/test">
    2. #тут могут быть и другие настройки типа AllowOverride или Allow
    3. Options ExecCGI
    4. </Directory>
    В том же файле продолжать?
     
  6. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Нужно сначала понять, по какому пути у тебя находится екзешник. Потом нужно посмотреть, что написано в описаниях директорий (Directory). Без этого советовать бесполезно. Всё, что нужно (наверное), я тебе показал. Остальное зависит от существующих настроек.
    И ещё, я не специалист по настройкам Апача, так что пользуйся советами на свою ответственность ;)
     
  7. kilogram

    kilogram Активный пользователь

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Экзэшник у меня находится 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>
    Тогда заработает?
     
  8. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Ниже других описаний директорий. В твоём случае так
    Код (Text):
    1. <Directory "C:/www/htdocs/test.ru/www">
    2. #тут могут быть и другие настройки типа AllowOverride или Allow
    3. Options ExecCGI
    4. </Directory>
     
  9. kilogram

    kilogram Активный пользователь

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Апач находится у меня на диске С:\www
    Я зашел в C:\www\conf
    в файл httpd.conf
    Ввел там такое
    Код (Text):
    1.     AddHandler cgi-script .cgi .pl .bat .exe
    2.     AddType cgi-script .exe
    Затем зашел в C:\www\conf нашел файл просто
    httpd(текстовой) нашел там
    Код (Text):
    1. <Directory "C:/www/cgi-bin">
    2.     AllowOverride None
    3.     Options None
    4.     Order allow,deny
    5.     Allow from all
    6. </Directory>
    и ввел ниже этого:
    Код (Text):
    1. <Directory "C:/www/htdocs/test.ru/www">
    2. #тут могут быть и другие настройки типа AllowOverride или Allow
    3. Options ExecCGI
    4. </Directory>
    Ввожу такую ссылку: http://test.ru/1.exe?a=1&b=2
    Опять скачивается файл 1.exe но не запускается
     
  10. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Апач перезапустил? Может ещё у тебя в описании виртуального хоста test.ru что-то написано?
    Надеюсь, завтра тебе ответят более продвинутые. Ушел спать.
     
  11. NeoXidant

    NeoXidant Активный пользователь

    С нами с:
    8 фев 2010
    Сообщения:
    121
    Симпатии:
    1
  12. kilogram

    kilogram Активный пользователь

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Переименовал и запустил http://test.ru/cgi-bin/1.cgi?a=1&b=2
    Выдает ошибку:
    Код (Text):
    1. Not Found
    2.  
    3. The requested URL /cgi-bin/1.cgi was not found on this server.
    [​IMG]
     
  13. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Вроде как папка cgi-bin должна быть на том же уровне, что и папка www для документов, чтобы к ней не было прямого доступа.
    ...htdocs\test.ru\cgi-bin\
    ...htdocs\test.ru\www\
    И будет работать только в том случае, если Апач настроен так.
    Обычно папка cgi-bin вообще лежит в папке с Апачем, а в конфиге должно быть прописано
    Код (Text):
    1. <IfModule alias_module>
    2. ScriptAlias /cgi-bin/ "путь_к/Apache/cgi-bin/"
    3. </IfModule>
    Ниже этих строк должны быть правила для папки cgi-bin
    Код (Text):
    1. <Directory "путь_к/Apache/cgi-bin">
    2.     AllowOverride None
    3.     Options None
    4.     Order allow,deny
    5.     Allow from all
    6. </Directory>
    В эту папку и нужно положить скрипт.
    Не знаю, что за проблемы такие, у меня во всех вариантах работает батник.

    Может, у тебя строка
    Код (Text):
    1. LoadModule cgi_module modules/mod_cgi.so
    не раскомментирована?
     
  14. kilogram

    kilogram Активный пользователь

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Проверил LoadModule cgi_module modules/mod_cgi.so Она раскомментирована.
    Настройки которые вы подсказали указать вроде указанны, вот из файла скопировал.
    Код (Text):
    1.  
    2. <IfModule alias_module>
    3.     #
    4.     # Redirect: Allows you to tell clients about documents that used to
    5.     # exist in your server's namespace, but do not anymore. The client
    6.     # will make a new request for the document at its new location.
    7.     # Example:
    8.     # Redirect permanent /foo http://localhost/bar
    9.  
    10.     #
    11.     # Alias: Maps web paths into filesystem paths and is used to
    12.     # access content that does not live under the DocumentRoot.
    13.     # Example:
    14.     # Alias /webpath /full/filesystem/path
    15.     #
    16.     # If you include a trailing / on /webpath then the server will
    17.     # require it to be present in the URL.  You will also likely
    18.     # need to provide a <Directory> section to allow access to
    19.     # the filesystem path.
    20.  
    21.     #
    22.     # ScriptAlias: This controls which directories contain server scripts.
    23.     # ScriptAliases are essentially the same as Aliases, except that
    24.     # documents in the target directory are treated as applications and
    25.     # run by the server when requested rather than as documents sent to the
    26.     # client.  The same rules about trailing "/" apply to ScriptAlias
    27.     # directives as to Alias.
    28.     #
    29.     ScriptAlias /cgi-bin/ "C:/www/cgi-bin/"
    30.  
    31. </IfModule>
    32.  
    33. <IfModule cgid_module>
    34.     #
    35.     # ScriptSock: On threaded servers, designate the path to the UNIX
    36.     # socket used to communicate with the CGI daemon of mod_cgid.
    37.     #
    38.     #Scriptsock logs/cgisock
    39. </IfModule>
    40.  
    41. #
    42. # "C:/www/cgi-bin" should be changed to whatever your ScriptAliased
    43. # CGI directory exists, if you have that configured.
    44. #
    45. <Directory "C:/www/cgi-bin">
    46.     AllowOverride None
    47.     Options None
    48.     Order allow,deny
    49.     Allow from all
    50. </Directory>
    Создал дополнительно папку cgi-bin на том же уровне, что и папка www для документов, чтобы к ней не было прямого доступа, как вы написали и скопировал туда 1.exe который я переименовал в 1.cgi затем. Нажал RESTART в Апаче.
    Ввожу в браузере http://test.ru/cgi-bin/1.cgi?a=1&b=2

    Код (Text):
    1. Not Found
    2. The requested URL /cgi-bin/1.cgi was not found on this server.
     
  15. NeoXidant

    NeoXidant Активный пользователь

    С нами с:
    8 фев 2010
    Сообщения:
    121
    Симпатии:
    1
    залейте куда-нибудь ваш 1.exe, чтобы я мог скачать
     
  16. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    В вашем случае экзешник (который переименовали в 1.cgi) нужно поместить в папку C:/www/cgi-bin/
    По правилу
    Код (Text):
    1. ScriptAlias /cgi-bin/ "C:/www/cgi-bin/"
    запрос http://test.ru/cgi-bin/1.cgi?a=1&b=2 будет направлен в директорию C:/www/cgi-bin/
     
  17. kilogram

    kilogram Активный пользователь

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Аллилуйя, заработало! Спасибо!
    Скажите, а для каких возможностях используются cgi, какие проги пишутся примерно чтоб использовать cgi для пхп?
     
  18. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Примите поздравления.
    Если уже написана какая-то программа, выполняющая какое-либо полезное действие и выводящая отчет в консоль, то проще её модифицировать так, чтобы вывод был по правилам CGI со всеми заголовками в браузер, а не переписывать функционал на PHP.
    Если писать с нуля, то сейчас многие задачи можно решить с помощью PHP, т.к. он умеет подключаться к разным БД, лекго работает со строками, с файловой системой, выводит в браузер, что хочешь.

    Мне вот интересен вариант использования, чтобы программа по 3д визуализации выводила картинку в браузер. На PHP пока не выполнимо. Во флеше можно, но качество рендера не удовлетворяет.
     
  19. kilogram

    kilogram Активный пользователь

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    То есть на С++, Java ничего не пишется для php? Если пишется, то что? Ещё момент, параметры 1 и 2 не подставляются почему в программу, не скажете почему? http://test.ru/cgi-bin/1.cgi?a=1&b=2

    Выдает вот такое:
    Код (Text):
    1. Здравствуйте! Мы знаем о Вас все!Ваш IP-адрес: 127.0.0.1
    2. Вот параметры, которые вы указали: (null)
    А параметры 1 и 2 не подставились почему-то.
     
  20. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    ?