Samoaktualizujący się panel allegro SUPLEMENCIAK
Wiele osób zalewało mnie mailami z informacją jak uruchomić panel allegro, gdy nie działa memcache … Odpowiedź była zawsze taka sama : nie da się bez przeróbek.
Postanowiłem napisać kilka myśli odnośnie jak taki panel uruchomić bez przetrzymywania danych w pamięci servera …. ponadto masę osób życzy sobie aby taki panel miał miniaturki aukcji są za każdem losowane.
A więc na początek należy pomyśleć gdzie będziemy zapisywali informacje pobrane z allegro … Zdjęcia miniaturek oczywiście pozostawiamy bez zmian, reszta :
-
Baza sql
-
Pliki txt
Wydawać by się mogło że baza sql (mysql lub postgresql) to idealny wybór … na pewno tak jest gdy nasz system będzie wykorzystywany dla więcej niż jednego konta allegro. Jednak już sobie wyobrażam jaki ruch on powoduje ;) do bazy i z powrotem …
Mój wybór padł na pliki txt, nie że to jest stare i sprawdzone, ale wydaje mi się że gdzie można trzeba stosować proste sposoby.
Nasz panel aukcji (wzorowany na poprzednim artykule) trzeba teraz zmodyfikować tak aby nie korzystał z memcache. Pierwsza sprawa – memcache ma własny garbage collection (tak sobie nazwę), przy plikach musimy sami dbać o usuwanie starych aukcji – rozwiązanie jest trywialne : każde pobranie aukcji musi nadpisywać plik.
Do losowego wyświetlania aukcji musimy pobrać wszystkie aukcje. Przerabiamy odpowiednio klasę allegro, a dokładnie funkcję getAuctionsFromAllegro. Po pobraniu aukcji musimy sprawdzić czy ilość aukcji dostępnych poprzez webapi nie jest większa od pobranych. Jeśli jest, ponawiamy pobieranie (poprzez zwiększanie offset'u) a wyniki doklejamy do poprzednich.
Zapisywanie aukcji zmieniamy teraz z memcache na pliki txt np. tak :
private function saveAuctions($aukcje=array())
{
$aukcje = serialize($aukcje);
$file =@ fopen($this->path.'aukcje.txt', "w") OR die('Nie udalo sie zapisac aukcji ! ');
fwrite($file, $aukcje);
fclose($file);
return;
}
Jak widać sposób jest prosty : serializujemy przekazaną tablicę, a następnie zapisujemy ją do pliku aukcje.txt. Odczyt aukcji z pliku powinien być odwrotny : odczyt pliku i unserialize();
Jak rozwiązać problem losowego wyświetlania aukcji ? Wydaje się że wystarczy losowo wyświetlać miniaturkę – z małym ale oczywiście. Załóżmy że wyświetlamy miniaturkę 1 z aukcji A, po kliknięciu w nią system powinien nas przekierować na tę właśnie aukcję. Aby „wiedział” na jaką musi je mieć jakoś powiązane … Odpada na stałe zapis przy każdym generowaniu, chyba że w sesji … Właśnie to wydaje mi się najszybsze i znowu najprostsze. Podczas generowania obrazka, musimy zapisać w sesji id miniaturki na panelu i odpowiadający jej adres url. Proste i szybkie !
Tworzymy sobie do tego jeszcze funkcję, która jest wywoływana przy przekierowaniu nas na allegro.pl. Powinna ona przy pomocy przekazanego id miniaturki odczytać z sesji odpowiedni url – czyżby to było takie proste ? JASNE!
No i chyba to tyle na temat suplementu do własnych miniaturek na aukcji …
Życzę udanych sprzedaży !
ps. piszcie jeśli macie jakieś uwagi → komentarze nie gryzą ;)
ps. dowiedz się także jak stworzyć i sprzedawać dobry serwis www
Klisiu
Pomóż proszę i napisz jak przerobić getAuctionsFromAllegro... Jestem laikiem i dopiero na podstawie jakiegoś gotowca się uczę :/ niestety walczę już z tym skryptem 2 tygodnie i ponieważ nie wyrzucał żadnych błędów w ogóle nie wziąłem pod uwagę, że ITL.PL nie ma obsługi memcacha :( przykra NIEspodzianka. Pomijam kwestię, że z CRONEM też mam problemy... ale to inna bajka i na to znajdę sposób. Najlepiej jak wrzuciłbyś taką sama paczkę z gotowym skryptem jak panel na memcachu. Ale póki co to zagłębiam się w php webapi :)
slavik
tutaj zamieszczam przerobione funkcje z pliku
allegro.inc.php(z tym czytaniem pewnie trochę nieoptymalnie mam, ale to już w zależności od potrzeb, każdy może przerobić):
private function saveAuctions($aukcje=array())
{
$f = fopen('aukcje.txt',"w");
$aukcje=serialize($aukcje);
fwrite($f,$aukcje);
fclose($f);
return;
}
public function printAuctions()
{
$f = fopen('aukcje.txt',"r");
$aukcje=fread($f,20000);
$aukcje=unserialize($aukcje);
if(count($aukcje)\n";
}
}
również w pliku panel_aukcji_mirvanos.php należało by wprowadzić pewne zmiany - zamienić ten kawałek kodu:
$memcache = new Memcache;
$memcache-connect('localhost', 11211) or die ("Could not connect to memcache !");
$aukcje =(array) $memcache-get($op['allegro_login']);
na:
$f = fopen('aukcje.txt',"r");
$aukcje=fread($f,20000);
fclose($f);
$aukcje=unserialize($aukcje);
to chyba wszystko, u mnie działa
To mirvanos:
Wielkie dzięki za ten skrypt.
Pozdrawiam
mirvanos
Niestety z udostępnieniem takiej paczki jest problem (co prawda posiadam takową działającą) taki iż zauważyłem że za dużo ludzi próbuje już na tym zarobić, a moim zamierzeniem było udostępnienie panelu dla każdego indywidualnie ...
Jeśli powiedzmy udostępnie wersję zaszyfrowaną to nici z nauki dla osób takich np. jak Ty Klisiu ...
Jak znajdę jakieś rozwiązanie tego problemu to napewno zamieszczę gotowe rozwiązanie ... tymczasem proszę próbować - w drobnych problemach na pewno każdy pomoże ;)
pozdrawiam serdecznie
Klisiu
mirvanos
$offset = 0;
$lp = 0;
$aukcje = array();
$response = $this->getAuctionsFromAllegroRaw($offset++);
$this->parseAuctions(&$aukcje, &$lp, $response);
if($this->howManyAuctions > $lp)
while($lp < $this->howManyAuctions)
{
$response = $this->getAuctionsFromAllegroRaw($offset++);
$this->parseAuctions(&$aukcje, &$lp, $response);
}
funckja getAuctionsFromAllegroRaw to p oprostu pobranie aukcji i zapisanie w $this->howManyAuctions = $response['user-item-count'];
Natomiast parserAuctions to ten wcześniejszy kod , czyli po prostu foreach na danych ....
No ... myślę że teraz każdy napisze już własny panel allegro ;)
pozdrawiam i życzę powodzenia
lisu
require_once('/allegro/config.php');
reszte kodu tak jak napisal klisiu i nic :/ nie wyswietlaja mi sie zadne aukcje, a gdy klikne na ktoreś z łączy to wyskakuje błąd T_STRING
tensh
Poza tym skrypt ładnie ściąga miniaturki i generuje linki do aukcji.
Do lisu: Pousuwaj wszystkie / obok nawiasów " i ' i zauważ podobieństwa między funkcjami memcache a tymi obsługującymi plik txt. Druga funkcja slavika nie jest kompletna, coś mu ucięło :)
lisu
kozunia
teraz wyrzuca mi taki błąd:
Parse error: syntax error, unexpected T_STRING in /homez.108/twojstyl/www/allegro/panel_aukcji_mirvanos.php on line 10
linia ta wygląda tak:
if(isset($_GET['aukcja']))
Pomoże ktoś?
lisu
Donq751
...allegro/panel_aukcji_mirvanos.php?aukcja=1
w czym moze tkwic blad?
Bylbym wdzieczny za podpowiedz
Pozdrawiam
piekloniebo
Mam pytanie?
Jak przerobić te dwie funkcje żeby zadziałały?
Starałem się kasowac znaki wstawione przez Lavika bo jak wstawiam to:
private function saveAuctions($aukcje=array())
{
$f = fopen(\'aukcje.txt\',\"w\");
$aukcje=serialize($aukcje);
fwrite($f,$aukcje);
fclose($f);
return;
}
public function printAuctions()
{
$f = fopen(\'aukcje.txt\',\"r\");
$aukcje=fread($f,20000);
$aukcje=unserialize($aukcje);
if(count($aukcje)\\n\";
}
}
to od razu mi w dreamweaverze podpowiada że są błędy chyba znaki \\
piekloniebo
Nie działa mi!
Ja bardzo chętnie Mirvanos zostawię link do twojej strony na moich aukcjach.
To jest bardzo pomocny skrypt ale niestety nie do końca jasno opisany. Dla laika nie do rozgryzienia.
pomóżcie
piekloniebo
To jest link do aukcji na której umieściłem twój skrypt.
Całość skryptów jest wrzucona na strone www.piekloniebo.pl
gdzie nie ma obsługi memcache wiec starałem się wprowadzić zmiany takie zeby lista aukcji była eksportowana do pliku txt.
To jest link:
http://www.allegro.pl/show_item.php?item=574424570
Co zrobiłem?
Poleciałem według zaleceń Slavika z drugiego komentarza do tego artykułu.
Natomiast już zupełnie nie wiem gdzie wstawić to z twojego komentarza.
$offset = 0;
$lp = 0;
$aukcje = array();
$response = $this-getAuctionsFromAllegroRaw($offset++);
$this-parseAuctions(&$aukcje, &$lp, $response);
if($this-howManyAuctions $lp)
while($lp howManyAuctions)
{
$response = $this-getAuctionsFromAllegroRaw($offset++);
$this-parseAuctions(&$aukcje, &$lp, $response);
}
mirvanos
tak na szybko, bo czas to pieniądz ;)
PiekłoNiebo : z komunikatu jasno wynika że nie masz pliku aukcje.txt ... stwórz takowy(pusty) z prawami zapisu dla daemona www np. chmod 777 jak nie wiesz jakie ....
moje funkcje nie nadają się na sztywno do wklejenia - to tylko fragment - jak pisałem nie dałem całej wersji panelu działającego na plikach ...
pozdrawiam serdecznie
piekloniebo
piekloniebo
dobra mam jeszcze jedno pytanie jeżeli plik config.php mam w katalogu allegro na swoim serwerze to ścieżka do tego katalogu powinna wyglądać tak:
require_once('config.php');
czy
require_once('http://www.piekloniebo.pl/allegro/config.php');
Kurcze dalej mi to nie działa.
piekloniebo
że jestem upierdliwy ale jak już zasiadłem i siedzę pół dnia to postaram się skończyć i skumać do końca.
w pliku config.php ścieżki do mojej strony powinny wyglądąć następująco prawda?
(Pliki są w katalogu allegro/ który mieści się w katalogy głównym strony.)
define('ADRES_AUKCJI', 'http://www.piekloniebo.pl/allegro/panel_aukcji_mirvanos.php?aukcja=');
define('ADRES_IMG', 'http://www.piekloniebo.pl/allegro/panel_aukcji_mirvanos.php?img=');
define('OKLADKI', 'http://www.piekloniebo.pl/allegro/okladki/');
Pozdrawiam
Darek
mirvanos
Tak gdzie jest require dajemy sciężkę do pliku na serverze nie poprzez protokół http - bo wtedy server "wykona" ten plik a nie go dołączy ... adres aukcji, img jest ok.
pozdr.
rysioslaw
mirvanos
rysioslaw
Michal08
Fatal error: main() [function.require]: Failed opening required 'http://michal08.is-the-boss.com/allegro/config.php' (include_path='.:/data/apache/php/mmp_lib') in /data/members/free/tripod/uk/m/i/c/michal08/htdocs/allegro/panel_aukcji_mirvanos.php on line 3
Dla mnie jest to dużo mało zrozumiałych znaczków, domyślam się że mam źle zapisaną ścieżkę do klasy allegro config.php, i tu pytanie, jak ona powinna wyglądać? Jeżeli jest jakiś inny błąd to również proszę o rady. Pozdrawiam.
PS. Mirvanos.. Jesteś na prawdę dobrym człowiekiem, mało kto pomaga innym bezinteresownie, i za to Ci dzięki;D
mirvanos
W kodzie musimy przekazać położenie pliku allegro.inc.php dla parsera PHP czyli np. jeśli jest on w
/data/members/free/tripod/uk/m/i/c/michal08/allegro.inc.php to tak tam wpisujemy t.z. do require ...
Jeli jest on w tym samym katalogu co plik panel_aukcji_mirvanos.php to ja zawsze daję :
require_once (dirname(__FILE__).'/allegro.inc.php');
pozdrawiam
Michal08
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /data/members/free/tripod/uk/m/i/c/michal08/htdocs/allegro/allegro.inc.php on line 5
Co tu może być nie tak?
mirvanos
Michal08
mirvanos
Michal08
Michal08
wolfen3
http://www.gold-studio.pl/allegro/
jac33k
Widzę że miniaturki ci się generują.
Mam tak samo jak Ty miałeś , nie widać miniaturek i nie generuje odnośników do aukcji.
supernova
Kombinuję z offsetem z wpisu nr 5, ale nie bardzo mogę dojść gdzie to wkleić.
Jakby jakaś wskazówką to prosiłbym...
mirvanos
o_rety
Zrobilem na plikach, linkuje ale nie wyswietla generowanych miniatur (z aukcji pobiera obrazki). Pytanie - czy celowo jest gdzies w kodzie umieszczony blad aby nie bylo tak latwo i kolorowo?
rosenzweigova
drugi dzień nad tym siedzę, z tym i owym sobie poradziłam, ale za chińskiego boga nie mogę sprawić, żeby skrypt zapisywał cokolwiek w okladkach, tzn. tło wyświetla, linkować linkuje, ale miniaturek nie pokazuje zupełnie...
Czy ja mogę prosić o jakąś umiarkowanie zawoalowaną podpowiedź? :)
rosenzweigova
Ale żeby nie marnować komenta - dałoby radę jakoś rozwinąć temat losowości wyświetlanych aukcji? Tak dla mniej oblatanych w pehapie?
poza tym - GIGANTYCZNE podzięki za ten skrypt!
pafflick
{
$f = fopen(\'aukcje.txt\',\"w\");
$aukcje=serialize($aukcje);
fwrite($f,$aukcje);
fclose($f);
return;
}
public function printAuctions()
{
$f = fopen(\'aukcje.txt\',\"r\");
$aukcje=fread($f,20000);
$aukcje=unserialize($aukcje);
if(count($aukcje)\\n\";
}
}
Nie wiem czy tylko u mnie, ale mi wywyała błąd składni w pliku, gdy wkleję ten kod. Po usunięciu slashów wszystko jest OK, ale nadal w linijce:
if(count($aukcje)\\n\";
jest Parse error: syntax error, unexpected '"' in /home/pafflick/public_html/test/allegro.inc.php on line 123
Adres do panelu http://pafflick.nstrefa.pl/test/
Z góry dzięki za pomoc...
pafflick
Tam właśnie wywala błąd składni, ale nie wiem jak to obejść :(
Informacje o aukcjach pobiera, okładki się tworzą, ale za cholerę nie chcą się wyświetlić na http://pafflick.nstrefa.pl/test/
Instrukcja jest możliwie jak najbardziej zagmatwana, a sytuację pogarsza fakt, że system dodawania komentarzy na tej stronie jest do d**y - przed każdym cudzysłowiem dodaje slashe i wszystkie kody trzeba poprawiać ręcznie.
pafflick
if(count($aukcje));
i nie ma błędu w składni, za to nie wyświetlają się miniaturki mimo iż w katalogu się tworzą. Naprawdę nie dało się zrobić gotowej paczki skryptu działającego na serwerze bez obsługi Memcahce? Pół dnia człowiek traci na użeranie się z tymi skryptami... :(