Autor Zpráva
Blem
Profil *
zdravím ...
nainstaloval jsem si xampp na localhost a nastal nečekaný problém :)

kódík vypadá nějak takto:


$okyli="0";
while ($okyli < 10) {

$vypiszesouboru = file_get_contents("http://urlserver/admin/ruco.php?id=$okyli"); // adresat zpravy


if (podminka) {
$okyli++;
echo "$vypiszesouboru<br />";
} else {
if($chybicka=="")$chybicka="0";
$chybicka++;
}
}
echo "OK: $okyli<br /> KO:$chybicka<br />".date("H:i:s");

mám ale problém s časem...
na serveru se tento "soubor" načte za pár sekund na localhostu to ale trvá přesně 10s.
když měním hodnotu while na více vždy to přesně odpovídá 1. sekundy...

hledal jsem zda je nějaké omezení v php.ini ale moc moudře jsem nepořídil...
nesetkal se někdo s podobným problémem? /předem upozorňuji že rychlostí netu to není :)
případně nenapadá někoho proč to dělá?
Darker
Profil
Zkus měřit přímo čas pře a po stažení.
$okyli = "0" 0;

/*...*/
if(!isset($chybicka))
  $chybicka= "0" 0;
Taky zkus dodat skutečnou adresu cílového skriptu, zpomalení může být tam.
A hlavně si dej na začátek skriptu error_reporting(E_ALL).
Blem
Profil *
em... :D
psal jsem že když to dám na server (jiný než z kterého se to sosá)
tak se to načte vpodstatě do sekundy

odkaz sem dát nemohu je to scriptík který se má načítat pouze v určitou chvíli ... náhodné otevírání by rozhodilo statistiky :)
chyba musí být někde na localhostu... napadlo mě omezení nějaké na usera... ale jaké???
:)
Darker
Profil
Tak pošlu zdrojové kódy obou skriptů. Šance, že někdo narazil na podobný problém a bude tušit není vysoká, ale šance, že po přečtení kompletního kódu někdo přijde na chybo už je vyšší.
Blem
Profil *
ještě bych rád dodal... že když script paralelně spustím i v jiném prohlížeči tak se kod dokončí až po tom prvním respektive o oněch 10 sek. déle od doby dokončení v prvním prohlížeči...
připadá mi to jako nějaká fronta v mysql když nestíhá (tento script s mysql vůbec nepracuje) :)
peta
Profil
Blem:
* Ja pouzivam Wamp server a nemam s nim zadne problemy.
* error_reporting(E_ALL), viz Darker. Pokud se objevi chyba, script muze zbrzdit reseni hlaseni chyby. Takze odstranit chyby.
* Pouzivej 1x echo nebo pridej pod error_reporting ob_flush.
* Zjisti si informace o serveru. HW na serveru a nastaveni byva obvykle 10x lepsi nez mas na stolnim pc. Proto to take stoji pul milionu, takovy obycejny server pro vice uzivatelu, ze? :)
* Zkus pouzivat file_exists.
* Jak jsou ty soubory velke? Php ma nekolik omezeni na cas a velikost, pro soubory, stranku, stahovani...
* Uplny kod, link, viz Darker.
"odkaz sem dát nemohu je to scriptík" Tve minus, tim se stava problem neresitelny. System dotaz-odpoved, tady problem neni, to nikoho asi dlouho bavit nebude, ale zkus to :)
"náhodné otevírání by rozhodilo statistiky" A udelat klon scriptiku do jineho souboru take rozhodi statistiku? Nebo zkopirovat na jiny hosting? :)

Jinak darker psal jeste o prevodu promenne string-integer, to php nuti mirne zpomaleni, ale muzes to tez opravit v obou pripadech.
$okyli = 0; //"0"
Blem
Profil *
peta:
error_reporting
kod nevyhazuježádnou chybu... mám - bez výsledku

Zjisti si informace o serveru
mam svůj dedikáč a pc co mám doma je mnohem výkonější :-D

Jak jsou ty soubory velke
výsledek má cca 40kb

Uplny kod
pár proměnných s textem jsem si odpustil :)
$getid = $_GET["id"];
include "../config.php";
$cox4="SELECT *  FROM `uzivatele` WHERE `uzivatele`.`id` = '$idx4' LIMIT 1";
$navratx4=mysql_db_query("$MySQL_databaze", $cox4, $spojeni);
for ($i=0;$i<mysql_num_fields($navratx4);
$i++){
}
while (list($idx4, $nickx4, $heslox4, $mailx4, $pohlavikx4, $vekkx4, $krajkx4, $poslanook1x4) = mysql_fetch_row($navratx4))
{
echo "OK";
$heslo = md5($heslox4);
include "../config.php";
mysql_select_db("$MySQL_databaze", $spojeni);
mysql_query("UPDATE `$MySQL_databaze`.`uzivatele` SET `heslo` = '$heslo' WHERE `uzivatele`.`id` = '$idx4' LIMIT 1", $spojeni);
mysql_query("UPDATE `$MySQL_databaze`.`jizzmeneno` SET `id` = '$idx4' WHERE `id` = '1' LIMIT 1", $spojeni);
mail($to, $subject, 'zvysujeme zabezpeceni bla bla...', $headers);
}
Tori
Profil
Blem:
K [#1]: Proběhne cyklus skutečně jen 10x? Nemohlo se stát, že podmínka na ř.7 byla opakovaně nesplněna a cyklus se provedl třeba 10000x? Zkoušel jste měřit, jak rychle na obou serverech proběhne načtení té stránky (file_get_contents), jestli je problém tam nebo jinde?

K [#7]: Když spustíte ten skript samostatně (ne pomocí file_get_contents), proběhne taky pomalu? A která část zpomaluje - SQL dotazy nebo odeslání mailu? (zkuste tam nasypat pár volání echo '<br>'.microtime(1); ať vidíte, kde je největší rozdíl časů; např. za řádky 2,4,7,9,15,16,17).
Mimo dotazovaný problém: Na ř.3 v SQL dotazu má asi být použitá $getid místo $idx4, ne? Proč include znovu uvnitř cyklu, stačí na ř.2. Nevím, co máte uvnitř cyklu for (ř.5), ale každopádně počet polí ve výsledku stačí zjistit jen jednou. Cyklus while je zbytečný, když na ř.3 žádáte jen 1 řádek výsledků.
Blem
Profil *
Tori:
Když spustíte ten skript samostatně
Jak jsem již psal na serveru mi ta aplikace načte za méně než sekundu...
na serveru problém nebude (max. že by server uměl řadit php do virtuální paměti příkazy php a já už to neviděl... ovšem to je ta otázka co nastavit v php aby se mi to na localhostu dělo také...)

Proběhne cyklus skutečně jen 10x
ve scriptu počítám i chyby...
viz $chybicka...


jednoznačně když juknu na smtp ... spustim script z serveru tak maily se tam oběví během sekundy ve frontě všechny ... zatím co u localhostu se následně v smtp ukazují po 1s.
Ugo
Profil
jelikož asi nikdo nemůže tušit co se kde dělá, tak to zkus jak je tu psáno od začátku, proměřit to kus po kusu a uvědomit si pár věcí

1. na woknech (xmpp určitě) je php řádově 10x pomalejší než na defaultní instalaci v linuxu
2. rychlost připojení a zjištování dns záznamu u tebe doma jistě nebude taková jako v serverovně, ale aby to bylo na vteřinu tak to souhlasim že asi ne

dokud nevíš kde je zpomalení tak nemá moc smysl spekulovat, zjisti aspoň jak dlouho trvá to načítání souboru (řekl bych že to bude právě docela dost vinou připojení)
peta
Profil
K ukazce kodu
- nevidim error_reporting ani ob_flush
- $getid neni ochraneno pres mysql_real_escape_string proti hacknuti
- v prvnim sql dotazu nahore, viz Tori, je nedefinovana promenna $idx4 (mozna je v configu, ten neni k ukazce pripojeny) SELECT * FROM `uzivatele` WHERE `uzivatele`.`id` = '$idx4' LIMIT 1
- pro pripojeni pouzivam mysql_connect jednou na zacatku a pro volani dotazu pak uz jen mysql_query. Ale to je detail.
- proc je include ve while cyklu, kdyz je i nahore uz jednou pouzite? include_once by to resilo, ale spis bych to v tom cyklu smazal.
- mail - na localu se vetsinou mail neda odeslat. Ale mozna to mas nastavene, aby to slo. Detail.
- jestli hledas limity, tak php ma cas pro vykonavani scriptu a velikost pameti pro script. Na serverech byvaji nastavene velmi nizne hodnoty. Jestli se ti to zacykli nebo zaplaca pamet, tak to by mohl byt problem. Zkus se podivat na rozdily v phpinfo().
- tez si nejsem jisty spojenim toho list + fetch ve while, co to udela pri poslednim zaznamu. Mozna rozdilna verze php se chova jinak.

for ($i=0;$i<mysql_num_fields($navratx4);
$i++){
}
Ten cyklus je prazdny.

`$MySQL_databaze`.`uzivatele`
To je nutne psat jen v pripade, ze propojujes dve ruzne databaze. Poud mas ale jmeno databaze stejne jako v connectu, promenna $spojeni, pak neni treba jmeno databaze uvadet.

Jo, napis si funkci treba sq(), ktera bude resit sql dotaz. Nemusis pak ke kazdemu vypisovat spojeni, databaze a pod. Opisovanim stejneho pak vznikaji ruzne preklepy. Nebo to budes chtit zmenit a musis to pak prepsat na kazdem radku.
A souhlasim s vypisovanim microtime, jak psali. Tim zjistis, ktera cast presne trva dlouho.
Blem
Profil *
Ugo:
dokud nevíš kde je zpomalení tak nemá moc smysl spekulovat
kdybych to věděl, nepíšu sem :D dle mého názoru to bude v nějakém omezení php (zkoušel jsem to i na optice a jak jsem psal netem to neni...

peta:
Zkus se podivat na rozdily v phpinfo()
můžeš prosím specifikovat přesněji co mám hledat? :)

mail - na localu se vetsinou mail neda...
druhý kod je na serveru nikoli na localu :)

$getid neni ochraneno pres mysql_real_escape_string proti hacknuti
script není veřejný hecker by musel znát celou IP serveru a cestu k souboru a url mám pouze na localhostu běžně na neveřejné IP :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: