Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: ZAJDAN 04. 10. 2016, 10:17:45

Název: AJAX a PHP – synchronizace generování PDF
Přispěvatel: ZAJDAN 04. 10. 2016, 10:17:45
Ahoj
mam web na kterém je formulář a SVG. Submitem vše odešlu na server ke zpracování.
Server data zpracuje a vytvoři PDF, které pošle do okna klientova prohližeče.
PHP script, který zapisuje soubory z dat poslané ajaxem používá jeden soubor jako kontajner a ten se každým dalším submitem přepíše.

PROBLEM:
odesílané SVG je někdy větší (6MB) a v závisloti na rychlosti klientova uploadu je čas 'relativní' a někdy nastanou situace že do generovaného PDF se dostane předchozí/neaktuální SVG.

poradili by jste mi?... jak synchronizovat proces zapsaní souboru 'scrip1.php' a generování PDF obsahující mimo jiné i SVG 'script2.php'

pro snadné pochopení jsem načtrtl jak jsou procesy navázány nyní.
Název: Re:AJAX+PHP- synchronizace
Přispěvatel: to_je_jedno 04. 10. 2016, 11:05:13
nesmis "prepisovat", ale dat si tam nejakou signaturu, treba sess_id + timestamp. a pak to cronem likvidovat kdyz je to starsi nez x.
Název: Re:AJAX+PHP- synchronizace
Přispěvatel: ZAJDAN 04. 10. 2016, 11:16:02
díky, ale jak ziskam ten 'random name' nově vytvořeného souboru do scriptu, který generuje PDF?
Název: Re:AJAX+PHP- synchronizace
Přispěvatel: jixmHech 04. 10. 2016, 13:12:52
K čemu je dobré poslat submitem formulář a svg ajaxem zvlášť a potom to synchronizovat k vytvoření jednoho souboru?
Název: Re:AJAX+PHP- synchronizace
Přispěvatel: ZAJDAN 04. 10. 2016, 13:16:56
K čemu je dobré poslat submitem formulář a svg ajaxem zvlášť a potom to synchronizovat k vytvoření jednoho souboru?
protože mne lepší metoda nenapadla, nejsem na tyto věci expert
zatím to řeším tak, že do scriptu co generuje PDF jsem dal delay
nechám si rád poradit od zkušenych, jak to dělat lépe
díky
Název: Re:AJAX+PHP- synchronizace
Přispěvatel: jixmHech 04. 10. 2016, 13:38:01
OK. Ale pořád tomu nerozumím. Proč to neposíláš v jenom požadavku?

Možná to má být rozdělení do "více vláken"? Tady ale ty procesy o sobě navzájem nevědí. Posunutím čekání na zpracování svg to nejspíš nevyřešíš. Budou chodit různé požadavky s různou dobou zpracování a jsi tam, kde jsi byl

Když uděláš 1 požadavek, tak celý script čeká, než se vyřeší všechny části a pak to pošle.

K tématu paralelního zpracování jsem našel https://php.vrana.cz/paralelni-zpracovani.php.

Víc jsem nehledal. Snad ti to pomůže.
Stejně mě zajímá ta motivace. Já taky žádný expert nejsem, třeba se přiučím (bez ironie)
Název: Re:AJAX+PHP- synchronizace
Přispěvatel: ZAJDAN 04. 10. 2016, 13:43:27
OK. Ale pořád tomu nerozumím. Proč to neposíláš v jenom požadavku?

Možná to má být rozdělení do "více vláken"? Tady ale ty procesy o sobě navzájem nevědí. Posunutím čekání na zpracování svg to nejspíš nevyřešíš. Budou chodit různé požadavky s různou dobou zpracování a jsi tam, kde jsi byl

Když uděláš 1 požadavek, tak celý script čeká, než se vyřeší všechny části a pak to pošle.

K tématu paralelního zpracování jsem našel https://php.vrana.cz/paralelni-zpracovani.php.

Víc jsem nehledal. Snad ti to pomůže.
Stejně mě zajímá ta motivace. Já taky žádný expert nejsem, třeba se přiučím (bez ironie)

máš namysli submitnou vše jedním Ajaxem?
Název: Re:AJAX+PHP- synchronizace
Přispěvatel: jixmHech 04. 10. 2016, 13:51:48
Ano.

A ještě jedna otázka. Jak může mít SVG 6 MB? Je to jen popis křivek odkud kam vedou a jakou mají polohu apod. Je to textový soubor

Jirka
Název: Re:AJAX+PHP- synchronizace
Přispěvatel: ZAJDAN 04. 10. 2016, 14:05:45
A ještě jedna otázka. Jak může mít SVG 6 MB? Je to jen popis křivek odkud kam vedou a jakou mají polohu apod. Je to textový soubor
jde o velmi složitou grafiku s několika vrstvy, ktere se daji interaktivně ovládat
Název: Re:AJAX+PHP- synchronizace
Přispěvatel: jixmHech 04. 10. 2016, 14:26:40
Tak dej vědět pls, jak to dopadlo
Název: Re:AJAX+PHP- synchronizace
Přispěvatel: none_ 04. 10. 2016, 14:39:35
A nebylo by lepsi nahravat ajaxem jen to SVG? Dat to jako prvni krok formulare. Jakmile to uzivatel vybere, tak spustit nahravani, zobrazit nejakej citlivej progress bar a zakazat odeslani formulare. Mezi tim by mohl uzivatel vyplnovat zbytek. Nahravani na success posle nejaky ID toho SVG. To uz vygenerovat nahodne na serveru (napr. ClientSVG_timestamp.svg). ID pripojim k datum ve formulari (napr. hidden field) a povolim uzivateli odeslat formular. Na serveru diky tomu budu mit jak jistotu, ze uz SVG mam, tak i informaci, kde ji hledat.
Název: Re:AJAX+PHP- synchronizace
Přispěvatel: ZAJDAN 06. 10. 2016, 17:57:29
Kód: [Vybrat]
A nebylo by lepsi nahravat ajaxem jen to SVG? Dat to jako prvni krok formulare. Jakmile to uzivatel vybere, tak spustit nahravani, zobrazit nejakej citlivej progress bar a zakazat odeslani formulare. Mezi tim by mohl uzivatel vyplnovat zbytek. Nahravani na success posle nejaky ID toho SVG. To uz vygenerovat nahodne na serveru (napr. ClientSVG_timestamp.svg). ID pripojim k datum ve formulari (napr. hidden field) a povolim uzivateli odeslat formular. Na serveru diky tomu budu mit jak jistotu, ze uz SVG mam, tak i informaci, kde ji hledat.

ne to by neslo, protoze formular ma checkboxy, kterymi se to svg interaktivne meni a teprve jeho finalní stav je potreba odeslat
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: ZAJDAN 06. 10. 2016, 17:59:27
napumpoval jsem tedy vsechno do ajaxu, ale server mi vraci chybu:

Kód: [Vybrat]
XMLHttpRequest cannot load http://mujweb/pdf/create-pdf.php. No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://www.mujweb.cz' is therefore not allowed access. The response had HTTP status code 500.
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: jixmHech 06. 10. 2016, 18:47:14
cross-domain request?

AJAX by měl chodit na stejné doméně. To voláte z localhost?
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: Kit 06. 10. 2016, 19:40:24
Napadlo mě, jak pojmenovat to PDF: Sesbírat vstupní data, provést hash (třeba SHA1) a podle toho to výstupní PDF pojmenovat a ten název poslat klientovi. Při reloadu stejných vstupních dat se to tedy pojmenuje stejně.
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: ZAJDAN 06. 10. 2016, 21:05:11
cross-domain request?

AJAX by měl chodit na stejné doméně. To voláte z localhost?
ne to jsem právě zkusil přímo na doméně....
napadlo mne, zda to nekoliduje s ContentSecurityPolicy nasazene na Apachi...je to mozne?
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: jixmHech 06. 10. 2016, 22:01:23
XMLHttpRequest cannot load http://mujweb/pdf/create-pdf.php. No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://www.mujweb.cz' is therefore not allowed access. The response had HTTP status code 500.

http://mujweb/pdf/create-pdf.php - toto je správně?
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: ZAJDAN 06. 10. 2016, 22:04:29
XMLHttpRequest cannot load http://mujweb/pdf/create-pdf.php. No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://www.mujweb.cz' is therefore not allowed access. The response had HTTP status code 500.

http://mujweb/pdf/create-pdf.php - toto je správně?
ten odkaz/link je smyšlený, ale ty máš nejspíše namysli to non www a ...s www...překontroluju to
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: jixmHech 06. 10. 2016, 22:30:08
XMLHttpRequest cannot load http://mujweb/pdf/create-pdf.php. No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://www.mujweb.cz' is therefore not allowed access. The response had HTTP status code 500.

http://mujweb/pdf/create-pdf.php - toto je správně?
ten odkaz/link je smyšlený, ale ty máš nejspíše namysli to non www a ...s www...překontroluju to
taky to může http a https, nebo prostě nastuduj tu hlavičku a pošli ji též. S ajaxem maturuju pokaždé, když chci něco složijějšího a odpověď 500 je to nejhorší - chyba požadavku? chyba serveru? konjunkce merkura s venuší? :-)
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: ZAJDAN 07. 10. 2016, 09:12:17
Citace
taky to může http a https, nebo prostě nastuduj tu hlavičku a pošli ji též. S ajaxem maturuju pokaždé, když chci něco složijějšího a odpověď 500 je to nejhorší - chyba požadavku? chyba serveru? konjunkce merkura s venuší? :-)
je pravdou, že na tom webu je nasazene SSL, ale neni tam force redirect na SSL, tak předpokladam, ze pokud na domenu pristoupim z http:// ...tak response pujde take z http:// ...coz i tak vypada....ceho jsem si ted jeste vsiml, je ze v ajaxu mam celou cestu na php, tak jeste zkusim cestu relativni bez http://...
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: ZAJDAN 07. 10. 2016, 11:31:27
opravil jsem v ajaxu cestu k php , taky nekolik spatnych nazvu promenych
nyni vse probehne bez erroru, na serveru se vytvori svg, debuger hlasi vse ok
jediny problem je, ze vytvorene PDF se do prohlizece neposle, tak tedy netusim co se deje
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: Kit 07. 10. 2016, 11:35:30
je pravdou, že na tom webu je nasazene SSL, ale neni tam force redirect na SSL, tak předpokladam, ze pokud na domenu pristoupim z http:// ...tak response pujde take z http:// ...coz i tak vypada....ceho jsem si ted jeste vsiml, je ze v ajaxu mam celou cestu na php, tak jeste zkusim cestu relativni bez http://...

Také je dobré si uvědomit, že komunikační protokol je sice HTTPS, ale hlavičky protokolu jsou HTTP.
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: ZAJDAN 07. 10. 2016, 11:54:38
Citace
Také je dobré si uvědomit, že komunikační protokol je sice HTTPS, ale hlavičky protokolu jsou HTTP.

upravil jse to tedy aby request i response byl na https://
odeslu formular a pozoruju co se deje v debugeru....vse ok
v response dokonce vidim zdrojak pdf:
Kód: [Vybrat]
%PDF-1.4
1 0 obj
<<
/Title (þÿ)
/Creator (þÿwkhtmltopdf 0.12.2.1)
/Producer (þÿQt 4.8.6)
/CreationDate (D:20161007114945+02'00')
>>
endobj
3 0 obj
....
...
..
ale stále se PDF nevráti okna prohlizece
metodou ulozeni do slozky jsem si overil, ze se PDF skutecne vytvori
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: ZAJDAN 07. 10. 2016, 12:15:39
projistotu jsem zalozil dotaz i na Githubu knihovny kterou pouzivam:
https://github.com/mikehaertl/phpwkhtmltopdf/issues/192
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: Kit 07. 10. 2016, 12:29:59
odeslu formular a pozoruju co se deje v debugeru....vse ok
v response dokonce vidim zdrojak pdf:
Kód: [Vybrat]
%PDF-1.4
..
ale stále se PDF nevráti okna prohlizece
metodou ulozeni do slozky jsem si overil, ze se PDF skutecne vytvori

Je nutné nastavit funkcí header() správné hlavičky MIME, na které bude prohlížeč adekvátně reagovat. Zkus tohle:
Kód: [Vybrat]
header("Content-type: application/pdf");
header("Content-Disposition: attachment;filename='dokument.pdf'");
// kód generující PDF
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: ZAJDAN 07. 10. 2016, 12:54:09
Citace
Je nutné nastavit funkcí header() správné hlavičky MIME, na které bude prohlížeč adekvátně reagovat. Zkus tohle:
Kód: [Vybrat]
header("Content-type: application/pdf");
header("Content-Disposition: attachment;filename='dokument.pdf'");
// kód generující PDF
díky za tip
nejde mi do hlavy proc toto nastane jen kdyz jsou data predana AJAXem...v puvodni variante vse fachalo spravne
PHP script generujici PDF zustal stejny jen jsem doplnil to ziskani a zapsani SVG
zkusil jsem tedy doplnit tu hlavicku, ale nepomohlo to
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: ZAJDAN 07. 10. 2016, 12:55:56
jestli je to pravda co rika Haertl(tvurce knihovny), tak je to pekne v pr....

You can not trigger a download dialog with AJAX request.
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: ZAJDAN 07. 10. 2016, 20:36:02
tak a je po slavě, slavnym AJAXem se ve jeste vice zkomplikovalo...zkusim se podivat zde se s tim da nejak vybruslit
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: dTTb 08. 10. 2016, 09:32:36
Tak si dej na ajaxComplete js presmerovani na vytvoreny pdf.
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: to_je_jedno 08. 10. 2016, 12:48:42
imho bys mel najit nejakyho seniora aby ti zkouknul celkovou architekturu toho reseni. me to prijde cele nejake divne.
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: Ondrej Nemecek 09. 10. 2016, 20:37:51
Tak si dej na ajaxComplete js presmerovani na vytvoreny pdf.

Přesně tak, ať ajax vrátí třeba json, podle které poznáš, zda vše proběhlo správně a jaké je url vygenerovaného pdf souboru. V javascriptu si ověříš úspěch a pokud je vše ok, přeměruješ stránku na to vygenerované pdf. Anebo třeba zobrazíš odkaz ke stažení apod.
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: ZAJDAN 12. 10. 2016, 15:10:30
SOLVED:
hoši moc díky za rady....
cílem bylo PDF na server neukládat, ale nezbylo mi nic jiného, než soubor na server uložit...
PHPkem jsem do Ajaxu vratil cestu k souboru, který ma vždy unikatní název a přes
window.open(data)
browser clientovi otevře nové okno s vygenerovaným PDF.
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: ZAJDAN 12. 10. 2016, 15:42:55
pozoruju, ze se mi casto otevre prazdne PDF...zkousim si alertnout co mi vraci PHP a prázdno
je mozne aby ajax provedl success a PHP jeste nezpracovalo vsechny ulohy?
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: ZAJDAN 12. 10. 2016, 16:55:25
po odeslani formulare vidim v debuggeru v zalozce Network status 'canceled' ...hmm proc?
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: ZAJDAN 12. 10. 2016, 17:38:46
vypada to, ze reseni je do js zakomponovat
event.preventDefault();
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: ZAJDAN 12. 10. 2016, 18:49:22
no aby toho nebylo malo, tak zjistuji, ze to facha pouze v Chromu a Vivaldi :(

Firefox vyhodí:
ReferenceError: event is not defined
Název: Re:AJAX a PHP – synchronizace generování PDF
Přispěvatel: ZAJDAN 12. 10. 2016, 19:26:01
Firefox vyresen...pro firefox je potreba predat parametr event:
$( "#createPDF" ).click(function(event) {
                                event.preventDefault();


ted jeste ten sileny IE a melo by byt hotovo