Jak postavit obrovský update? – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak postavit obrovský update? – PHP – Fórum – Programujte.comJak postavit obrovský update? – PHP – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Matěj Andrle+1
Grafoman
4. 2. 2016   #1
-
0
-

Dobrý den,
mám opravdu monstrózní update a potřeboval bych řádně nastavit timeouty - padá mi to na 500...

set_time_limit(999999);

$subpublisher = "";
$xml = new XMLReader();
$database = new PDO("mysql:host=localhost;dbname=ads", "root", "fdfasdfasdsdfs");
$database->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$ch = curl_init("https://tango.admeta.com/api/CRMHTTPService/CRMHTTPService.svc/subpublishers?name=&zipcode=&street=&city=");
curl_setopt($ch, CURLOPT_MUTE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERPWD, "dsfdfsdf");
$xml->xml(curl_exec($ch)) or die("Error: Cannot read subpublishers");
curl_close($ch);
while ($xml->read())
{
	if ($xml->name == "name")
	{
		$xml->read();
		if ($xml->depth == 3)
			$subpublisher = $xml->value;
		else
		{
			$statement = $database->prepare("UPDATE `source` SET `subpublisher` = :subpublisher WHERE `website` = :website");
			$statement->bindParam(":subpublisher", $subpublisher);
			$statement->bindParam(":website", $xml->value);
			$statement->execute();
		}
		$xml->read();
	}
}

Děkuji.

Nahlásit jako SPAM
IP: 31.30.56.–
ondrej39+1
Věrný člen
4. 2. 2016   #2
-
0
-

#1 Matěj Andrle
Jednou z možností, jak aktualizovat všechno naráz, je poskládat si SQL dotaz s CASE klíčovým slovem.

CASE <nějakýSloupec> [WHEN <hodnotaNějakéhoSloupce> THEN <hodnotaKterouChcešPřiřadit> ...] END

Výsledný SQL pak může vypadat nějak následovně:

UPDATE `source`
    SET `subpublisher` = CASE `website`
        WHEN "název první stránky" THEN "první sub_publisher"
        WHEN "název druhé stránky" THEN "druhý sub_publisher"
        WHEN "název třetí stránky" THEN "třetí sub_publisher"
    END
WHERE `website` IN ("název první stránky, "název druhé stránky", "název třetí stránky")
Nahlásit jako SPAM
IP: 78.156.159.–
Inject all the dependencies!
Matěj Andrle+1
Grafoman
4. 2. 2016   #3
-
0
-

#2 ondrej39
A o co mu tedy jde? (Vždyť to nedělám naráz - tak proč to padá na 500?) Respektive to mám vytvářet pokaždé instanci, anebo nedá se jen pohrát si se sezením?

Nahlásit jako SPAM
IP: 31.30.56.–
ondrej39+1
Věrný člen
4. 2. 2016   #4
-
0
-

#3 Matěj Andrle
A jsi si jistý, že ti to padá na kroku s databází? Nepadá ti to třeba na volání té služby?

Nahlásit jako SPAM
IP: 78.156.159.–
Inject all the dependencies!
Matěj Andrle+1
Grafoman
4. 2. 2016   #5
-
0
-

#4 ondrej39
Pokaždé se upraví stejný počet záznamů a pak to padne.

Při načítání adresy http://52.48.50.57/test.php narazily stránky na chybu. Na této adrese možná právě probíhá údržba stránek, nebo jsou stránky chybně nakonfigurovány.

Co by se mu tedy mohlo dít?

Nahlásit jako SPAM
IP: 31.30.56.–
Řešení
ondrej39+1
Věrný člen
4. 2. 2016   #6
-
0
-
Vyřešeno Nejlepší odpověď

#5 Matěj Andrle
To by mohlo být skoro cokoliv v PDO driveru.

Zabal si volání PDO a jeho tvorbu do try/catch bloků a vypiš si zprávu výjimky, kterou ti PDO driver vyhazuje. Aktuálně ti to nejspíš vrací pětikilo, protože PDO vyhodí výjimku, kterou nemáš zpracovanou.

Nahlásit jako SPAM
IP: 78.156.159.–
Inject all the dependencies!
Matěj Andrle+1
Grafoman
4. 2. 2016   #7
-
0
-

#6 ondrej39
Toto jsem nečekal - pardon za desinformaci:

Caught exception: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (ascii_bin,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '=' Caught exception: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (ascii_bin,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '='
Nahlásit jako SPAM
IP: 31.30.56.–
ondrej39+1
Věrný člen
4. 2. 2016   #8
-
0
-

#7 Matěj Andrle
Buď máš tabulky ve špatném kódování, nebo v tom XML jsou data ve špatném kódování. Každopádně se to dá natvrdo vyřešit použitím příkazu COLLATE.

Nahlásit jako SPAM
IP: 78.156.159.–
Inject all the dependencies!
Matěj Andrle+1
Grafoman
4. 2. 2016   #9
-
0
-

#8 ondrej39
Švédštinu v tom nezřím: " Poradte.cz-Pocitace_a_prislusenství-C" Já nečekal, že tam bude diakritika (o možnostech kódování jsem uvažoval, timeout mi přišel logičtější) - stačí tedy jednoduchý převod... Děkuji.

Nahlásit jako SPAM
IP: 31.30.56.–
ondrej39+1
Věrný člen
4. 2. 2016   #10
-
0
-

#9 Matěj Andrle
Švédštinu budeš mít spíš u sebe, řekl bych. Z nějakého důvodu to bývá implicitní nastavení kódování znaků v MySQL.

Nahlásit jako SPAM
IP: 78.156.159.–
Inject all the dependencies!
Kit+15
Guru
4. 2. 2016   #11
-
0
-

#7 Matěj Andrle
V našich končinách bývá nezbytné nastavit UTF-8 pro veškerou komunikaci s databází. Máš do toho zamíchanou i Latin-1, která se nás vůbec netýká. 

<?php
$database = new PDO("mysql:host=localhost;dbname=ads;charset=UTF8", "root",...
Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Matěj Andrle+1
Grafoman
4. 2. 2016   #12
-
0
-

#10 ondrej39
Nebere PDO náhodou encoding databáze - tam je UTF-Bin... Neznám možnost, jak v PDO nastavit encoding.

Nahlásit jako SPAM
IP: 31.30.56.–
Matěj Andrle+1
Grafoman
4. 2. 2016   #13
-
0
-

#10 ondrej39
Aha - kódování tabulky! Tak tím je to vyřešené - stačí jen toto a hotovo.

Nahlásit jako SPAM
IP: 31.30.56.–
Kit+15
Guru
4. 2. 2016   #14
-
0
-

#10 ondrej39
Ano, švédština je defaultní pro MySQL. Správce databáze sice může nastavit UTF-8, ale skoro nikdo to nedělá a proto se na to vůbec nedá spolehnout. Je nutné zkontrolovat/předělat všechny tabulky, zda náhodou nejsou v Latin1.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Matěj Andrle+1
Grafoman
4. 2. 2016   #15
-
0
-

#14 Kit

#10 ondrej39
Změněno a stejně:

Caught exception: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (ascii_bin,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '=' in "Blesk pro muže - C"

Caught exception: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (ascii_bin,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '=' in "Poradte.cz-Pocitace_a_prislusenství-C"

Collate tabulky je přitom na UTF!

Nahlásit jako SPAM
IP: 31.30.56.–
Kit+15
Guru
4. 2. 2016   #16
-
0
-

#15 Matěj Andrle
Nejspíš budeš muset znovu založit tabulky se správným kódováním a znovu do nich nasypat data.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
3981 příspěvků
4. 2. 2016   #17
-
0
-

Viz Kit #7
Kdyz delas importy a exporty, tak se nemuzes spolehnout na kodovani a je lepsi to tam vzdy napsat, treba pres SET NAMES. Mysql 4+- a mensi nezna SET NAMES. Default kodovani ma latin1swedish. V tomhle kodovani ti vyplivne vystup. A s timto kodovanim ti to take importuje.
Pri importu, kdyz nastavis SET NAME na latinswedish a tabulky budou mit kodovani latinswedish, a sloupce tabulek taky, tak se to naimportuje spravne.
Ted to mozna reknu nepresne...  Kdyz budes chtit jine kodovani, tak musis nastavit v tabulce a sloupcich jine kodovani, ale SET NAMES pouzit pro latinswedish. Pak by se ti to melo prekonvertovat z latin na kodovani v tabulce. V aplikaci pak pouzijes SET NAMES pro to druhe kodovani, treba UTF-8.

A dlouhy import, prenos souboru od uzivatele na server, resim komprimaci pres zip.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:cbc:766...–
peter
~ Anonymní uživatel
3981 příspěvků
4. 2. 2016   #18
-
0
-

Jestli mas firefox, a podari se ti ten soubor zobrazit ve firefoxu, tak si tam zkus pomenit kodovani a zjisti si, v jakem kodovani ten soubor je, cili, kdy zobrazuje spravne diakritiku (zobrazeni - znakova sada).
A pak je jeste dost casta chyba, prace s utf textem pomoci php funkci bez mb_. Treba strlen("vsechnyutfznaky") a mb_strlen("vsechnyutfznaky") ti da odlisne cislo, protoze utf obsahuje znaky, ktere se zapisuji jako dvojznak.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:cbc:766...–
Kit+15
Guru
4. 2. 2016   #19
-
0
-

#15 Matěj Andrle
Napiš DB dotaz: 

SHOW CREATE TABLE `source`;

a pošli sem výsledek.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Matěj Andrle+1
Grafoman
4. 2. 2016   #20
-
0
-

#19 Kit 

CREATE TABLE `source` (
 `index` int(11) NOT NULL AUTO_INCREMENT,
 `system` varchar(50) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
 `subpublisher` varchar(50) CHARACTER SET ascii COLLATE ascii_bin DEFAULT NULL,
 `website` varchar(60) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
 `webpage` varchar(50) CHARACTER SET ascii COLLATE ascii_bin DEFAULT NULL,
 `placement` varchar(60) CHARACTER SET ascii COLLATE ascii_bin DEFAULT NULL,
 `dsp` varchar(50) CHARACTER SET ascii COLLATE ascii_bin DEFAULT NULL,
 `totalImpression` int(11) DEFAULT NULL,
 `soldImpression` int(11) NOT NULL,
 `totalRevenue` int(11) NOT NULL,
 `date` date NOT NULL,
 PRIMARY KEY (`index`)
) ENGINE=InnoDB AUTO_INCREMENT=55783 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Reporting statistiky'
Nahlásit jako SPAM
IP: 31.30.56.–
Matěj Andrle+1
Grafoman
4. 2. 2016   #21
-
0
-
Nahlásit jako SPAM
IP: 31.30.56.–
Kit+15
Guru
4. 2. 2016   #22
-
0
-

#20 Matěj Andrle
Proč máš sloupečky definovány ascii? Dáváš do nich pouze znaky bez diakritiky?

ascii_bin a utf8_bin v collate tam máš kvůli čemu? Vždyť to  má jen samé nevýhody.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Matěj Andrle+1
Grafoman
4. 2. 2016   #23
-
0
-

#22 Kit
ASCII, poněvadž nevyužívám diakritiku - tak porovnávat jeden byte a více se mi jeví jako rozdíl. UTF-8 je právě kvůli vstupu! :S (Uvažuji nad změnou.)

Nahlásit jako SPAM
IP: 31.30.56.–
Kit+15
Guru
4. 2. 2016   #24
-
0
-

#23 Matěj Andrle
Znak v UTF-8 bez diakritiky zabere 1 bajt stejně jako v ASCII. Přestaň šetřit tam, kde se šetřit nemá.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Matěj Andrle+1
Grafoman
4. 2. 2016   #25
-
0
-

#24 Kit
Ovšem zjištění, že tomu tak je, to zabere více. Porovnávat přímo určený jeden byte je rozhodně snazší, než odhadovat, zda náhodou další znak nemá 2 byty... Jak píši - mohu to kdykoli změnit. Zde mne překvapily 2 věci - diakritika na konci záznamu (přitom 99.9 % záznamů nemá diakritiku a má to skýtat 100 %.) a defaultní encoding PHPMyAdmin.

Nahlásit jako SPAM
IP: 31.30.56.–
Kit+15
Guru
4. 2. 2016   #26
-
0
-

#25 Matěj Andrle
Jenže když do takového sloupce v ASCII náhodou strčíš něco v UTF-8 (cokoliv s nastaveným 8. bitem), tak ti to zhavaruje. Stojí ti to za to?

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
3981 příspěvků
5. 2. 2016   #27
-
0
-

ASCII napad je to zajimavy, nicmene neprakticky. Pokud to jde, tak dnes pouzijen UTF na vse. V opacnem pripade si klidne pouzij, co chces, ale pak se nediv, kdyz ti tam neco nepujde a nebo budes mit nekolik php kodu, abys kazdy rozdil mohl zpracovat. Cili, treba ted mas jiste kod, ktery odstranuje diakritiku. A ted je otazka, zda to potrebujes nebo to delas jen proto, aby jsi usetril?
Rychlost se u Mysql resi spravnym nastavenim indexu v tabulce a spravnym napsanim dotazu. 1.000.000 zaznamu nedela mysql, na dnesnim beznem pc, zadny velky problem.
Priklad spatneho dotazu s grupovanim muzu uvest tady od studentu. Bylo treba vyhledat vsechny publikace, ktere maji alespon jednoho autora ze seznamu 20. Nebo v druhem pripade vsechny autory ze seznamu. Studenti meli dotaz tak, ze kvadraticky narustal cas reseni pri zvysovani autoru a to tak neunosne, ze se dali vyhledavat jen 3 jmena. Predelal jsem to na spojovani vysledku pres UNION a ted vyhledani 20 jmen je rychlejsi nez 2 jmena puvodniho dotazu. (6 jmen to hledalo treba 20 minut pri asi 1000 zaznamech)

Nahlásit jako SPAM
IP: 2001:718:2601:26c:4512:f5...–
Matěj Andrle+1
Grafoman
5. 2. 2016   #28
-
0
-

#27 peter
Diakritiku neodstraňuji - vůbec tam být neměla. Tak proto. (Někdo se uklepl a na konec jednoho slova ji přidal - za to nemohu.)

Nahlásit jako SPAM
IP: 31.30.56.–
Kit+15
Guru
5. 2. 2016   #29
-
0
-

#28 Matěj Andrle
Chceš tím snad naznačit, že nemůžeš za pád své aplikace, pokud někdo vloží chybná vstupní data?

S takovým přístupem bych neměl nikde šanci. Máš příliš tolerantní zákazníky.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
5. 2. 2016   #30
-
0
-

#27 peter
Snad nám nechceš tvrdit, že standardní JOIN byl tak pomalý.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
3981 příspěvků
8. 2. 2016   #31
-
0
-

Kit - Na tvou otazku nelze odpovedet. Spatne definovane pojmy. Ten dotaz proste vytvarel kaskadu vysledku. Cim vic autoru, tim mnohonasobne vic raku, ktere pak vsechny filtroval. No, nemusim rikat, jak tim zahlcoval server. Ze tam treba visel dotaz 3 dny :) Ikdyz ten clovek uz davno vypnul pc, co jej poslal.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:d16e:54...–
Kit+15
Guru
8. 2. 2016   #32
-
0
-

#31 peter
Promiň, ale 50k záznamů nemůže být žádný problém, pokud ten SQL dotaz totálně nezvořeš.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
3981 příspěvků
8. 2. 2016   #33
-
0
-

Ja to vim. Na mne nekoukej. Proc jsem jim to asi prepsal, ze? :)

Nahlásit jako SPAM
IP: 2001:718:2601:26c:d16e:54...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý