Mit jelent, hogy a PHP CGI módban fut?
Sziasztok!
Szeretnék túljutni egy már eléggé elcsépelt kérdéskörön, de ahhoz, hogy ez bekövetkezzen, meg szeretném érteni a folyamat lépéseit, hiszen ha nem értem, nincs mit erőlködni rajta!
A téma a fájl feltöltés közben megszerezni a fájl méretét és a feltöltött mennyiséget. DE!
Szeretném leszögezni, hogy kizárólag az ehhez kapcsolódó, általam még nem ismert kérdésekkel kapcsolatban kérek segítséget, nem az alkalmazással kapcsolatban! És lehet, hogy mások számára kézenfekvő dolgokról fogok hülyeségeket kérdezni, plz. nézzétek el! :)
1. Mit jelent az hogy php cgi módban? Ezek szerint egy perl szkript másképp fut mint egy php?
2. Mit jelent az, hogy egy php-t egy másikon vezetek át (ami cgi módban fut)?
Köszönöm a türelmeteket,
s_volenszki
■ Szeretnék túljutni egy már eléggé elcsépelt kérdéskörön, de ahhoz, hogy ez bekövetkezzen, meg szeretném érteni a folyamat lépéseit, hiszen ha nem értem, nincs mit erőlködni rajta!
A téma a fájl feltöltés közben megszerezni a fájl méretét és a feltöltött mennyiséget. DE!
Szeretném leszögezni, hogy kizárólag az ehhez kapcsolódó, általam még nem ismert kérdésekkel kapcsolatban kérek segítséget, nem az alkalmazással kapcsolatban! És lehet, hogy mások számára kézenfekvő dolgokról fogok hülyeségeket kérdezni, plz. nézzétek el! :)
1. Mit jelent az hogy php cgi módban? Ezek szerint egy perl szkript másképp fut mint egy php?
2. Mit jelent az, hogy egy php-t egy másikon vezetek át (ami cgi módban fut)?
Köszönöm a türelmeteket,
s_volenszki
CGI, fájlfeltöltés, ilyesmi
A CGI az ősrégi módszer aktív weblapokhoz (szerveroldali logikához). CGI bármilyen végrehajtható fájl lehet. Ha az apache beállítások megengedik a könyvtárra a CGI-k végrehajtását, és a fájl attribútuma is futtatható, akkor a szerver futtatni fogja a programot. A standard inputon megkapod a POST adatait, és a standard outputra írt dolgokat a szerver a kliensnek (böngésző) továbbítja. (A request különböző paramétereit környezeti változóként kapod meg).
CGI-t írhatsz bash shellszkriptként, írhatod c-ben és lefordíthatod, vagy éppenésggel lehet egy PHP szkript. A lényeg, hogy a rendszerben végrehajtható program legyen. (Egy bash szkript értelemszerűen nem fog lefutni egy windows-os szerveren).
Az átvezetésen arra gondoltam, hogy ha van egy (többékevésbé) kész alkalmazásod, amit a PHP modullal futtatsz, akkor nem kell azt átírni CGI-nek, hanem írhatsz egy apró CGI-t, ami proxyként működik: csak az upload progress-t intézi, és 100%nál meghívja (socketen) a valódi feltöltés-kezelő PHP-t, és továbbítja neki az egész requestet. Tehát egy nagyon primitív reverse proxy juttatja el a fájlt feltöltés után az azt kezelő PHPnek. Így nem kell átírni ameglévő programodat.
Van egy harmadik megoldás is, ami ugyan nem volt kérdés, de talán érdekel: Ezt nem próbáltam ki, de ha valami trükkös REWRITE-tal átírod a request method-ot POST-ról mondjuk BLAHBLAHBLAH-ra, akkor a PHP nem fogja lekezelni a feltöltést, hanem (akárcsak CGI módban) a standard inputról olvashatod be az egészet (php://input).
Azt hiszem, ez egy kicsit sok volt egyszerre!
Először is köszi hogy foglalkozol a kérdéseimmel!
Azt írja a tárhely szolgáltatóm hogy:
Ez azt jelenti, hogy ha ebbe a könyvtárba bemásolok egy php-t,
Ha jól értem, az a különbség (sok minden mással egyetemben) a kettő között, hogy ha a Apache dolgozza fel a programot (php), akkor amíg az elindított folyamat nincs kész, addig nincs visszafele adat, ha viszont a php.exe, akkor van?
Például a fájlfeltöltés esetében az történik, hogy először, csak azért, hogy megszerezzük a fájl méretével kapcsolatos adatokat, beugrasztunk egy CGI módban futó feltöltő rutint, majd ha megvannak a szükséges adatok, akkor tovább passzolja a feltöltést egy szabvány, Apache által értelmezett feltöltő rutinnak?
s_volenszki
Nagyjából
A fejlécben már benne lesz a POST hossza (amiben akár több fájl is lehet). Ezt egy TEMP fájlba írod. Gondolom AJAXos progrss indikátort szeretnél, úgyhogy egy másik PHP szkript csekkolhatná a temp fájlod méretét, és ezt küldhetné a kliensnek.
Ha fent van minden, akkor tovább kell küldeni a POST adatot (lokálban, mondjuk socketen) a valódi szkriptnek, ami feldolgozza, és mit sem sejt az egész proxyzásról.
Ha az apache modul futtatja a PHP-t, és POST van, akkor a PHP feldolgozza postot, még mielőtt elkezdené a szkript végrehajtását. Ha a metódus nem POST, hanem más, akkor megkapod a post adatokat amint érkeznek, nem kell megvárni a teljes feltöltést. Ugyanígy CGI módban sem "szívja el" a PHP a postot. Szóval nem azért kell CGI mód, mert az annyira más, hanem azért, mert a PHP "véletlenül" úgy viselkedik ilyenkor ami nekünk jó.
Eddig értem!
Első lépésben a fájlfeltöltő ürlapom action paramétere a cgi módban futó php legyen.
Amikor a cgi módban futó php el kezd betöltődni, a header-ből ki kell hámozni a POST méretét,
majd a header-ben található paramétereket átadom fsockopen-nel az eredeti feltöltő fájlnak és megszerzem az ideiglenes fájl nevét.
Ezek után már csak az indikátor van hátra, ami nem más, mint egy cilikus fájlméret lekérés.
s_volenszki
Nagy vonalakban
Vagyis te döntessz, a CGI-ben a standard inputról jövő adatokat egyből tolod is tovább a socketnek és csak az átvitt bájtok számát tárolod valami féjlban, amit elér a számláló, vagy egy temp fájlba írod a postot (enneka fájlnak a méretét fogja frissítgetni az indikátor-szkript), és ha kész, akkor egyben írod az adatokat a socketre.
Odáig eljutottam, hogy.
Odáig eljutottam, hogy a CGI módban futó php-vel tudok post adatokat manipulálni és tovább küldeni egy Apache által értelemezett php-nek (a php manualban találtam példát).
Már az is megvan, hogy ha $_FILES van, akkor mekkora a mérete a feltöltendő fájlnak, de sajnos nem tudom továbbküldeni a $_FILES tömböt. Illetve tovább tudom, de a továbbküldés eredménye annyi lesz, hogy a file POST változó egyenlő lesz azzal hogy Array. Ezt értem, hiszen az egy tömb, de azt írja a manual, hogy ha
Mi lehet a hiba?
s_volenszki
Nem cgi
Nevezd át .cgi-nek, és tedd futtathatóvá.
Valamit nem értek!
Újra és újra átolvasom amiket írtál nekem segítségképpen, és a kövekező kérdések merült fel bennem:
A cgi tulajdonképpen lejátsza a teljes feltöltési folyamatot, és amikor kész, akkor az eredeti feltöltő rutin megtalálja a cgi álltal elkészített temp fájlt és az azt mondja, hopp már meg is van és bemásolja a helyére?
Az mit jelent, hogy minden php fájl a tárhelyemen cgi módban fut? Mert cgi módban fut az összes!
s_volenszki
A távgyógyítás elég nehézkes...
Pár ismérv a CGI módról:
- A phpinfo függvény nem HTML táblázatot generál, hanem plaintextként sorokba írja ki a dolgokat.
- A $_SERVER["argv"][0] tartalmazza a szkript nevét (slérési úttal), és persze a $_SERVER["argc"] legalább 1
Amire gondolok: lehet, hogy fastcgi van, és az lehet, hogy a síma php modul módjára viselkedik. Van a fastcgi-ről (suexec-kel) egy cikk itt a Weblaboron valahol.
suexec
Egy biztos, az átirányítás működik!
Odáig jutotam, hogy működik az átirányítás! Ez az átirányítós fájl (php manual segített)!
Ezek szerint nincs rendben valami a cgi móddal?
s_volenszki
Google?
http://www.google.com/search?q=php+ajax+upload+progress+bar
A feladathoz mérten (gauge megjelenítése file feltöltéskor) kicsit soknak érzem az eddig befektetett energiát...
Köszönöm, kedves, vagy!
Valóban sok energiám van benne, de engem a tudásvágy hajt, nem a kész alkalmazás! Ha megtanulom, hogyan kell ezt csinálni, legközelebb csak szóba kerül egy erre a technológiára épített alkalmazás, és én már majd értem is miről van szó!
Attól függetlenül már néztem a guglit és a te javaslataidat is áttekintem, hiszen a tutorialok magában rejtik a megoldást!
s_volenszki
szerk.:
Pontosan az volt a topicom célja, hogy megértsem a CGI módú program futtatást, és az, hogyan lehet, kell alkalmazni. Mert ha ezt értem, akkor a többi már menni fog úgy vélem!
Ok, ok
Be szép is volt a régi szép időkben, amikor perl cgi-kről álltam át php/fi-re :)
Örülök, hogy értesz!
Arról volt szó, hogy a cgi módban futó php-nek lesz egy "rendhagyó" tulajdonsága, méghozzá az, hogy még a fájl feltöltése közben elérhetővé válnak benne a szükséges infók!
Én arra gondoltam, hogy ha a header "lemásolása" és elküldése előtt, kiírom egy txt fájlba a számomra fontos adatokat, akkor az úgymond párhuzamosan zajlik a feltöltéssel. Ez a feltételezés helytálló?
s_volenszki
Socket
Visszavonulok!
A jelenlegi tudásom kevés, így célirányos dokumentáció vagy "tanár" nélkül nem találok rajta fogást!
Esetleg valaki szeretne zsebpénzért tanítani? :)
s_volenszki