[Megoldva] PHP CGI-ként lassú

Sziasztok !

Feltettem a PHP 5.2.5-öt az apache mellé úgy, hogy CGI-ként fusson, de az a gond, hogy 8másodpercet kell várni a php-s oldalaknál, hogy a php-cgi.exe elkezdje az oldal feldolgozását. ha modulként teszem be, akkor viszont alig 1másodperc kell, és be is töltötte az oldalt (ebből az következik, hogy nem maga az odalon levő kód a lassú).

Apache konfig (csak a fontosabbak):


LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
LoadModule asis_module modules/mod_asis.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_default_module modules/mod_authz_default.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule cache_module modules/mod_cache.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule dir_module modules/mod_dir.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule env_module modules/mod_env.so
LoadModule gzip_module modules/mod_gzip.so
LoadModule isapi_module modules/mod_isapi.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule security2_module modules/mod_security2.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule unique_id_module modules/mod_unique_id.so
LoadModule userdir_module modules/mod_userdir.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so

<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

<IfModule mime_module>
    TypesConfig conf/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
</IfModule>

<Location />
    AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml application/x-javascript application/x-httpd-php application/x-httpd-php-source
</Location>

<IfModule alias_module>
    ScriptAlias /php/ "C:/win32/usr/local/php/"
</IfModule>

<IfModule actions_module>
    Action application/x-httpd-php "/php/php-cgi.exe"
</IfModule>

<Directory "C:/win32/usr/local/php/">
    Options None
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

Timeout 10
KeepAlive On
MaxKeepAliveRequests 500
MaxRequestsPerChild 1000

KeepAliveTimeout 5

SetEnv PHPRC "C:/win32/etc/apache2/php"

<IfModule mpm_prefork_module>
    StartServers    100
    MinSpareServers 65
    MaxSpareServers 100
    MaxClients  256
    ServerLimit 256
</IfModule>

PHP konfiguráció (csak a fontosabbak):


; Language Options
;;;;;;;;;;;;;;;;;;
engine = On
safe_mode = On
safe_mode_include_dir = "C:/win32/usr/share/php;C:/win32/usr/share/php"
disable_functions = dl exec ini_alter leak openlog passthru proc_close proc_open shell_exec system virtual ini_restore syslog disk_free_space disk_total_space diskfreespace phpinfo

disable_classes =
expose_php = Off
max_execution_time = 60
max_input_time = 75

memory_limit = 64M

; Paths and Directories
;;;;;;;;;;;;;;;;;;;;;;;
include_path="C:/win32/usr/share/pear;C:/win32/usr/share/php"
extension_dir = "C:/win32/usr/lib/php5"

; Dynamic Extensions
;;;;;;;;;;;;;;;;;;;;
extension=php_gd2.dll
extension=php_mbstring.dll
extension=php_mcrypt.dll
extension=php_suhosin.dll

extension=php_mysql.dll
extension=php_openssl.dll

Hozzászólások

fastcgi?

--
Unix, Perfectly "natural" after five or ten years.

mod_php is futott, de most az lett az igény, hogy futás közben lehessen változtatni a php.ini beálításait. Egyébként tuti, hogy nem az a gond, hogy CGI-ként fut a php, meg hogy nincs fastcgi modul, ugyanis más szerveren (amin szintén nincs fastcgi, és szintén CGI-ként fut a php) alig 1mp. a válaszolási idő.

Mert pl. mod_php-vel csak egy konfigod lehet, és opciók közül nem lehet mindent apache konfigbol oldalanként állítani.
Például ha nem szeretnéd, hogy php-ből működjön a sys tem("cat /etc/pass wd"), akkor le kell tiltanod az összes programfuttatásra lehetőséget adó függvényt. (Az ilyen típusú támadás ellen a base_dir nem nyújt semmilyen védelmet sem, apache chroot alatt túl sok minden nem hajlandó működni, alap webhostinghoz site based virtualizáció overkill.)
Ezt viszont szerver-instanciánként csak egyszer állíthatod, így ugyanott nem fogsz tudni programfuttatást igénylő szolgáltatást, pl. egy cactit kiszolgálni.

Ellenben ha cgi-ként futtatod, php-nként használhatsz másik konfigot.

--
The Net is indeed vast and infinite...
http://gablog.eu

en spec szeretem php 5.2.5-ot apache 2.2.x-szel es mod_fcgid-vel

t

Megpróbáltam az fcgid, és a fastcgi modult is, de az eredmény annyi lett, hogy most nem ~8mp.-et kell várni a válaszadási időre, hanem ~6-7mp-et "csak".

CGI-s PHP-t használok, a végrehajtás legfeljebb 1-2 tizedmásodperc.

Úgyhogy más lehet a gond, pl. sokáig tarthat neki, amíg konnektál az adatbázisszerverbe, ilyesmire érdemes gondolni.

--
CCC3

Sebességmérés alapján az adatbázishoz csatlakozási idő: 0.01293s, és 0.05876s között van (Ezt a mérést elvégeztem modulként-, és CGIként futó php-n is. Az eredmény ugyanaz).

Közben rájöttem, hogy a CGI feldolgozza 1-2másodperc alatt a weblapot, aztán leáll a php-cgi.exe (ami azt jelenti, hogy kész a feldolgozással; mindezt a feladatkezelőből néztem), majd 5-6másodperc után hirtelen beadja a generált lapot a böngésző (több böngészőből is próbáltam mielőtt valaki erre gyanakodna). Fogalmam sincs mi lehet a probléma oka :(.

Az error log ezt írja ki:


[Thu Feb 21 22:00:03 2008] [error] [client 86.101.242.57] script not found or unable to stat: C:/web/etc/apache2/C
[Thu Feb 21 22:00:03 2008] [error] [client 86.101.242.57] script not found or unable to stat: C:/web/etc/apache2/C
[Thu Feb 21 22:00:36 2008] [error] [client 86.101.242.57] script not found or unable to stat: C:/web/etc/apache2/C
[Thu Feb 21 22:00:36 2008] [error] [client 86.101.242.57] script not found or unable to stat: C:/web/etc/apache2/C
[Thu Feb 21 22:01:17 2008] [error] [client 86.101.242.57] Error in my_thread_global_end(): 1 threads didn't exit\r<

Ennek lehet valami köze a lassúsághoz ?

Nem talál egy fájlt (C:/web/etc/apache2/C), fogalmam sincs, mi ez.

Ez (1 threads didn't exit) belefér abba, amit gondoltam, hogy nem fejeződik be a PHP program.

Hogy világosabb legyen: A webszerver futtatja a CGI programot (jelen esetben a PHP-t) méghozzá úgy, hogy a PHP stdout-ja nem a konzolra megy, hanem a webszerver olvassa egy pipe-ból. Amit az stdoutra kiír a PHP program, azt küldi a webszerver a böngészőnek. A webszerver onnan veszi észre, hogy a PHP program elkészült, hogy amikor a PHP kilép, akkor lezáródik az a pipe, amit a webszerver olvasna. Ez az, ami nem történik meg. Ilyenkor a szerver vár egy kicsit (ez lehet az a 6-7 másodperc), aztán lelővi a PHP-t, és ami addig jött a pipe-on, azt küldi a böngészőnek. Legalábbis nekem ez jut eszembe a dologról.

--
CCC3

Sikerült eljutnom odáig, hogy a MySQL-le van valami. Ha csinálok egy phpinfo() tartalmú oldalt, akkor azt lefuttatja 1,229mp. alatt. Viszont ha egy oldal MySQL csatlakozást igényel, akkor a php kód lefut, de nem fejeződik be (mint ahogy kiderült a korábbiakban), így vár a webszerver, aztán 4-6mp. után lelövi a php-cgi.exe-t (és ez tart sokáig).

Sikerült megoldani. Utánanéztem, és ez egy php bug. A lényeg annyi, hogy le kell tölteni a php5.2.1-et, és abból ki kell szedni a libmysql.dll -t, majd ezzel a fájllal felül kell írni a már telepített php (esetemben a php5.2.5) libmysql.dll-jét. Ezután már rendesen fog működik :).

Mindenkinek köszönöm a segítséget !

Kötelező windows-on kínlódnod apache-al? Nincs lehetőséged az apache stb. számára "natívabb" környezetben dolgozni?

szerk: látom megoldva.. :-)

Valaki tud valami saját tapasztalatot mondnai v. benchmark-ot windwos-os apache vs. linux (stb.) apache összehasonlításról?