Kirjoittaja Aihe: ohjelman käynnistymisen rajaus ?  (Luettu 4734 kertaa)

Mistofelees

  • Käyttäjä
  • Viestejä: 663
    • Profiili
ohjelman käynnistymisen rajaus ?
« : 21.11.11 - klo:12.59 »
Itsellä on werkkosivu, jonka kautta käynnistetään Imagemacki:n convert jokaiselle sivulla olevalle kuvalle erikseen.
Ongelma on siinä, että sivulla on pahimmillaan 400-800 kuvaa ja HTML käynnistää convertin jokaiselle kuvalle erikseen.
Tämä ajaa koneen jumiin ja serverillä näkyy ilmoitus siitä, että muisti on täynnä.
Convertia ei voi ajaa *.* muodossa, koska kuville tehtävät operaatiot ovat kuvakohtaisia.

Onko mitään temppua, jolla saisi estettyä convertia käynnistymästä uudestaan, ennenkuin edellinen ajo on loppunut ?

Sami Lehtinen

  • Käyttäjä
  • Viestejä: 754
  • Techie
    • Profiili
    • Sami Lehtinen
Vs: ohjelman käynnistymisen rajaus ?
« Vastaus #1 : 21.11.11 - klo:20.40 »
Onko mitään temppua, jolla saisi estettyä convertia käynnistymästä uudestaan, ennenkuin edellinen ajo on loppunut ?

Varmasti montakin, riippuen tilanteesta varmaan kannattaisi ajaa niitä 4-8 kpl:n pooleissa. Pistäppä hieman enemmän detaileita tulemaan siitä kuinka suoritat noiden prosessien käynnistämisen.

Mistofelees

  • Käyttäjä
  • Viestejä: 663
    • Profiili
Vs: ohjelman käynnistymisen rajaus ?
« Vastaus #2 : 23.11.11 - klo:16.30 »
Onko mitään temppua, jolla saisi estettyä convertia käynnistymästä uudestaan, ennenkuin edellinen ajo on loppunut ?

Varmasti montakin, riippuen tilanteesta varmaan kannattaisi ajaa niitä 4-8 kpl:n pooleissa. Pistäppä hieman enemmän detaileita tulemaan siitä kuinka suoritat noiden prosessien käynnistämisen.


Hieman hankala heittää esimerkkiä, koska php koodia on paljon ja seassa osia, jotka generoivat javascriptiä ja html:ää. Leikkaan tähän kuitenkin homman ytimen
Toivottavasti leikkelyssä ei jää mitään oleellista pois

$tiedostot=glob('*');   //**
// Pistetään järjestykseen:
 array_multisort(
     array_map( 'filemtime', $tiedostot ),
     SORT_NUMERIC,
     SORT_ASC,
     $tiedostot
 );

// Tarkistetaan, onko kuva:
$kuvapaatteet=array("JPG","PNG","GIF","TIF","TIFF","BMP");
foreach ($tiedostot as $file){
         //Irroitetaan nimen etu- ja loppuosa:
         list($etunimi,$jat) = split('[.]', $file,3);
         $jat=strtoupper($jat);
        // Tark. tiedoston pääte:
         if (in_array($jat,$kuvapaatteet)){
                // Minikuvat joiden alussa 't_', ohitetaan, muista tehdään minikuvat:
                if (strpos($file,"t_") === false){
                    $tee="convert -strip -size 160x160 ".$file." -resize  160x160 ".$tfile.">/dev/null&";
                    exec($tee);
                 }
          }
}

Hakemistorakennetta on hankala muuttaa, koska hakemistoja on useita kymmeniä neljällä eri palvelimella. Lisäksi koodi on osaksi itsegeneroituvaa ja -kopioituvaa ja rakentaa automaattisesti alihakemistoja.
Osaongelma on siinä, että kukin hakemisto sisältää myös tekstitiedostoja sekä jo käsiteltyjä kuvatiedostoja, joiden nimen alkuosana on 't_'.
« Viimeksi muokattu: 23.11.11 - klo:16.32 kirjoittanut Mistofelees »

odysseus

  • Vieras
Vs: ohjelman käynnistymisen rajaus ?
« Vastaus #3 : 24.11.11 - klo:18.24 »
Pari aivan muuta juttua nyt ihan alkuun:

list($etunimi,$jat) = split('[.]', $file,3);

split() on deprecated, joten käytä preg_split() tai tuohon tarkoitukseen käytä mielummin funktiota pathinfo().

Ja ÄLÄ MISSÄÄN NIMESSÄ käytä noita suomenkielisiä nimeämisiä koodissa!!! Herranjumala sentään se on EI EI EI EI EI ja vielä kerran EI! -koskaan et voi tietää minkä maalainen/kielinen tyyppi koodia seuraavaksi muokkaa! Englanti on koodikieli!

Ja siten asiaan.

Tää on aika raju homma jos tiedostoja on paljon:
$tiedostot=glob('*');

Eikö voisi jotenkin rajoittaa hakua? Vaikkapa edes mimetype kerrallaan... $imgfiles = glob("*.jpg")..

Onko softa sellainen, minne tulee siis jatkuvasti uusia kuvia konvertoitavaksi? Ethän vain konvertoi jotain aina näytölle jokaisella kerralla kun sivu ladataan selaimeen? ->Tallennettaessa konvertoidaan sopivaksi ja näytölle näytetään aina valmista kauraa oikean kokoisena kun sivuja ladataan!

Ja sitten jos tarvitset rajumpaa wait-objektien käsittelyä, niin kannattaa tutustua tähän:
http://php.net/manual/en/book.sem.php
« Viimeksi muokattu: 24.11.11 - klo:18.26 kirjoittanut odysseus »

Mistofelees

  • Käyttäjä
  • Viestejä: 663
    • Profiili
Vs: ohjelman käynnistymisen rajaus ?
« Vastaus #4 : 25.11.11 - klo:08.58 »
Pari aivan muuta juttua nyt ihan alkuun:

list($etunimi,$jat) = split('[.]', $file,3);

split() on deprecated, joten käytä preg_split() tai tuohon tarkoitukseen käytä mielummin funktiota pathinfo().

Ja ÄLÄ MISSÄÄN NIMESSÄ käytä noita suomenkielisiä nimeämisiä koodissa!!! Herranjumala sentään se on EI EI EI EI EI ja vielä kerran EI! -koskaan et voi tietää minkä maalainen/kielinen tyyppi koodia seuraavaksi muokkaa! Englanti on koodikieli!

Ja siten asiaan.

Tää on aika raju homma jos tiedostoja on paljon:
$tiedostot=glob('*');

Eikö voisi jotenkin rajoittaa hakua? Vaikkapa edes mimetype kerrallaan... $imgfiles = glob("*.jpg")..

Onko softa sellainen, minne tulee siis jatkuvasti uusia kuvia konvertoitavaksi? Ethän vain konvertoi jotain aina näytölle jokaisella kerralla kun sivu ladataan selaimeen? ->Tallennettaessa konvertoidaan sopivaksi ja näytölle näytetään aina valmista kauraa oikean kokoisena kun sivuja ladataan!

Ja sitten jos tarvitset rajumpaa wait-objektien käsittelyä, niin kannattaa tutustua tähän:
http://php.net/manual/en/book.sem.php


Hyviä kommentteja.

- Tuo split on opeteltu silloin joskus, kun se ei vielä ollut deprecated. Kokeilen noita ehdottamiasi
- Olet varsin oikeassa nimeämisten ja kommenttien suhteen. Yleensä käytän muutenkin mieluummin englantia kaikessa. Tässä leikkeessä kuitenkin vaihdoin tekstit suomalaisiksi selkeyden vuoksi. (toisaalta tämä softa ei varmaan koskaan tule leviämään kovin laajalle.)
- Tuo esittämäsi  $imgfiles = glob("*.jpg") antaa ajatuksia. Tuolla saattaisi päästä seulomaa tiedostoja nykyistä tekniikkaa helpommin.
- Kuvia ja muita fileitä tulee jatkuvasti. Kuvat tuodaan levyjaon kautta eli samban avulla tai sftp:llä. Joka kerta, kun sivulle tullaan, tehdään nopea tarkistus, onko hakemistoon tullut uusia kuvia ja konvertoidaan niistä minikuvia.
- Pitää tutustua tuohon semafori-systeemin iltalukemisina.

Jos asia kiinnostaa, niin sivuston Wanha Wersio on käytössä yhdessä DMZ-verkon koneessamme hupikäytössä:
http://ptm2.cc.utu.fi/~ptmusta/kuvat/index.shtml.
Tämän jälkeen koko koodi on kirjoitettu kokonaan uudestaan ja mukaan on tullut paljon uutta. Wanha Wersio on kirjoitettu html:llä ja Perlillä ja jakaantuu moneen erilliseen fileeseen. Uusi on html:ää, php:tä ja javascriptiä ja tiedostoja on vähemmän.
Seuraava versio on hiljalleen työn alla ja tulee sisältämään myös hakupuu-tyyppisen tiedonkeruu-työkalun, jota olen kehitellyt erillisenä projektina.

Tästä ei ole tarkoitustakaan tulla mitään kaupallista tai edes aktiivisesti jaettua. Jos tämä pitäisi tehdä jakeluun, kannattaisi koodi jakaa huolellisemmin moduleihin ja funktioihin ja käyttää CSS:ää. Samaten salasanojen hallinta pitäisi pistää uusiksi. Nyt koodi on aika pahaa spagettia.

odysseus

  • Vieras
Vs: ohjelman käynnistymisen rajaus ?
« Vastaus #5 : 25.11.11 - klo:09.49 »
Olin itseasiassa eilen liian väsynyt ajattelemaan kirkkaasti. On se kumma kun yöllä sitten....

Eli tuossahan on pääongelmana se, että ajetaan convert, joka käynnistetään "PHP:n ulkopuoliseen prosessiin". Miksi käyttää convertia kun PHP:ssa on itsessään nuo konvertointifunktiot, jolloin muistinhallinta pysyy kasassa.

Tässä mallia, joka on jo alunperin jostain netistä otettu ja muokattu:

Koodia: [Valitse]
/**
  Resize image.

  @param original_file Original file
  @param destination_file Destination path
  @param resized_width New width
  @param resized_height New height

  @return Image type or false if error.
*/
function create_resized_image($original_file, $destination_file, $resized_width, $resized_height) {
  // Image types: 1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP,
  //  7 = TIFF(orden de bytes intel), 8 = TIFF(orden de bytes motorola),
  //  9 = JPC, 10 = JP2, 11 = JPX, 12 = JB2, 13 = SWC, 14 = IFF, 15 = WBMP, 16 = XBM.
  list($original_width, $original_height, $type) = getimagesize($original_file);

  if ($type == 1) { // GIF
    $original_image = imagecreatefromgif($original_file);
    // Transparency - white
    $white = imagecolorallocate($original_image, 255, 255, 255);
    $transparent = imagecolortransparent($original_image, $white);
  }
  elseif ($type == 2) { // JPEG
    $original_image = imagecreatefromjpeg($original_file);
  }
  elseif($type == 3) { // PNG
    $original_image = imagecreatefrompng($original_file);
  }
  else { // Not supported -> Means TODO rest of the formats :-)
    $type = false;
  }
  if ($type) {
    // Save picture aspect:ratio
    $new_w = $original_width / $resized_width; // Width
    $new_h = $original_height / $resized_height; // Height
    if ($new_w > $new_h || $new_w == $new_h) {
      if ($new_w < 1)
        $new_w = 1; // If original is smaller, we keep original
      $new_width = $original_width / $new_w;
      $new_height = $original_height / $new_w;
    }
    elseif ($new_w < $new_h) {
      if($new_h < 1)
        $new_h = 1; // If original is smaller, we keep original
      $new_width = $original_width / $new_h;
      $new_height = $original_height / $new_h;
    }
    $image = imagecreatetruecolor($new_width, $new_height);
    imagecopyresampled($image, $original_image, 0, 0, 0, 0, $new_width, $new_height, $original_width, $original_height);
    if ($type == 1) // GIF
      imagegif($image, $destination_file);
    elseif ($type == 2) // JPEG
      imagejpeg($image, $destination_file);
    elseif($type == 3) // PNG
      imagepng($image, $destination_file);
    imagedestroy($image); // Destroy image from memory - keep in disk though..
  }
  return $type;
}


ajaaskel

  • Palvelimen ylläpitäjä
  • Käyttäjä
  • Viestejä: 3401
    • Profiili
Vs: ohjelman käynnistymisen rajaus ?
« Vastaus #6 : 25.11.11 - klo:10.19 »
off-topic:
Lainaus
Jos asia kiinnostaa, niin sivuston Wanha Wersio on käytössä yhdessä DMZ-verkon koneessamme hupikäytössä:
http://ptm2.cc.utu.fi/~ptmusta/kuvat/index.shtml.
En voinut olla kurkistamatta noita Wanhoja sivuja.  Itselleni tuttujen elektronikkajuttujen lisäksi osui silmään tämä atk-ongelma josta laitan kuvan alle:
« Viimeksi muokattu: 25.11.11 - klo:10.22 kirjoittanut ajaaskel »
Autamme ilolla ja ilmaiseksi omalla ajallamme.  Ethän vaadi, uhoa tai isottele näin saamasi palvelun johdosta.

Mistofelees

  • Käyttäjä
  • Viestejä: 663
    • Profiili
Vs: ohjelman käynnistymisen rajaus ?
« Vastaus #7 : 25.11.11 - klo:14.00 »
Olin itseasiassa eilen liian väsynyt ajattelemaan kirkkaasti. On se kumma kun yöllä sitten....

Eli tuossahan on pääongelmana se, että ajetaan convert, joka käynnistetään "PHP:n ulkopuoliseen prosessiin". Miksi käyttää convertia kun PHP:ssa on itsessään nuo konvertointifunktiot, jolloin muistinhallinta pysyy kasassa.

Tässä mallia, joka on jo alunperin jostain netistä otettu ja muokattu:

Kiitos tuosta koodista. Pitää testata.
PHP:ssä on valtavasti työkaluaja, joita ei ole tullut kaiveltua esiin ;)

odysseus

  • Vieras
Vs: ohjelman käynnistymisen rajaus ?
« Vastaus #8 : 25.11.11 - klo:16.39 »
Kiitos tuosta koodista. Pitää testata.
PHP:ssä on valtavasti työkaluaja, joita ei ole tullut kaiveltua esiin ;)

Tuon pitäisi kyllä pelata.

Koodi on tosiaan alunperin jostain netistä jo kaivettu (koska pyörää ei kannata keksiä uudelleen) ja itse olen sitä aikanaan hieman muokannut... Toimiva se on (oli ainakin viimeksi), mutta en ole vaivautunut tutkimaan että voisiko sitä optimoida jotenkin.

..olen huono väittämään näistä kun on vain hieman vajaa 30 vuotta tuota C-koodauskokemusta takana ja PHP on vähän uudempi. Sitä olen vääntänyt vain noin 8 vuotta... PHP:tä ennen tehtiin nuo hommat Ansi-C:llä ja cgi:n päälle. Joskus piti vääntää myös jotain Win32 ISAPI (Extension/Filter) kamaa myös kun Apache ei oiekin vielä ollut markkinajohtaja webissä silloin! Nythän asiat on toisin kun Linux + Apache jyrää ja PHP rullaa päällä ja vanhan koodarin on kaikkein vaikeinta ymmärtää miten jotain voi ohjelmoida ilman aitoja pointtereita ja free()"-komentoja :-)
Silloin kun C oli puuta ja koodarit rautaa koodattiin sellaisia muistiosoitinhärveleitä, että hirvittää. Nyt kun katson joitain noista 20 vuotta vanhoista binääripuukäsittelijöistä (esimerkkipätkä alla) jne, jota tuli koodattua, niin totuus on se, että "älä koske - se toimii". Enää en osaisi korjata jos ei toimisi, mutta yllätys, ne toimii edelleen Ansi kääntäjällä olipa alustana Linukka, Winukka tai Unix...

Se oli siis sitä aikaa kun #define:t oli tällaisia:

Koodia: [Valitse]
#define B_ROTATE(CC, RR, XX, YY) { \
  auto LPBTREE_LEAF pC, pGC; \
  auto cmp = (*CC->cmpfnc)(XX, YY->dat); \
  CC->rgStats[S_ROTATIONS]++; \
  if (cmp < 0) { pC = YY->pLeft; } \
  else { pC = YY->pRight; } \
  if ((*CC->cmpfnc)(XX, pC->dat) < 0) { pGC = pC->pLeft; pC->pLeft = pGC->pRight; pGC->pRight = pC; } \
  else { pGC = pC->pRight; pC->pRight = pGC->pLeft; pGC->pLeft = pC; } \
  if (cmp < 0) { YY->pLeft = pGC; } \
  else { YY->pRight = pGC; } \
  RR = pGC; }

Ja koodissa sitten sitä käytettiin jotakuinkin näin:

Koodia: [Valitse]
LOCAL LPBTREE_LEAF BSplit(LPBTREE_CTX Ctx, void *x, LPBTREE_LEAF pGG, LPBTREE_LEAF pG, LPBTREE_LEAF pP, LPBTREE_LEAF pX)
{
  pX->fRed = 1;
  pX->pLeft->fRed = pX->pRight->fRed = 0;
  if (pP->fRed)
  {
    register int c1;
    register int c2;

    Ctx->rgStats[S_SPLITS]++;
    pG->fRed = 1;
    c1 = (*Ctx->cmpfnc)(x, pG->dat);
    c2 = (*Ctx->cmpfnc)(x, pP->dat);
    if ((c1 < 0) != (c2 < 0))
      B_ROTATE(Ctx, pP, x, pG);
    B_ROTATE(Ctx, pX, x, pGG);
    pX->fRed = 0;
  }
  Ctx->pR->pRight->fRed = 0;
  return pX;
}

Noi on hauskoja, missä on osoitin osoittimeen, joka osoittaa osoittimeen, joka osoittaa osoittimeen, missä on jokin osoitin arvona itse tietoon, joka tietysti on struct tmv.!

Edit: En muuten ole edes aivan varma onko tuo esimerkki juuri omaa koodiani vaiko jonkun muun tekemää (ainakin osin), mutta jotakuinkin noi se meni.
« Viimeksi muokattu: 25.11.11 - klo:16.44 kirjoittanut odysseus »

Mistofelees

  • Käyttäjä
  • Viestejä: 663
    • Profiili
Vs: ohjelman käynnistymisen rajaus ?
« Vastaus #9 : 28.11.11 - klo:16.47 »
Kiitos tuosta koodista. Pitää testata.
PHP:ssä on valtavasti työkaluaja, joita ei ole tullut kaiveltua esiin ;)

Tuon pitäisi kyllä pelata.

Jotain ongelmaa tässä on. Itsellä php5 ja apache2 serverissä. Kokeilin kahdella tavalla:
        $original_image = imagecreatefromJPEG($original_file);
        $original_image = imagecreatefromjpeg($original_file);
Scripti pysähtyy tähän,
Samaten
        $original_image = imagecreatefromgif($original_file);

phpinfo:n listauksessa ei näy GD:tä, vaikka käsittääkseni pitäisi.
Ajoin apt-get install php5-gd
Tulos:
GD Support => enabled
GD Version => 2.0

Silti scripti joko
Pysähtyy kohtaan $original_image = imagecreatefromJPEG($original_file);
tai suorittaa $original_image = imagecreatefromgif($original_file);

Kumpikaan ei tuota destination-filettä

Taistelu jatkuu.

odysseus

  • Vieras
Vs: ohjelman käynnistymisen rajaus ?
« Vastaus #10 : 28.11.11 - klo:19.07 »
Kiitos tuosta koodista. Pitää testata.
PHP:ssä on valtavasti työkaluaja, joita ei ole tullut kaiveltua esiin ;)

Tuon pitäisi kyllä pelata.

Jotain ongelmaa tässä on. Itsellä php5 ja apache2 serverissä. Kokeilin kahdella tavalla:
        $original_image = imagecreatefromJPEG($original_file);
        $original_image = imagecreatefromjpeg($original_file);
Scripti pysähtyy tähän,
Samaten
        $original_image = imagecreatefromgif($original_file);

phpinfo:n listauksessa ei näy GD:tä, vaikka käsittääkseni pitäisi.
Ajoin apt-get install php5-gd
Tulos:
GD Support => enabled
GD Version => 2.0

Silti scripti joko
Pysähtyy kohtaan $original_image = imagecreatefromJPEG($original_file);
tai suorittaa $original_image = imagecreatefromgif($original_file);

Kumpikaan ei tuota destination-filettä

Taistelu jatkuu.



Hmmm, outoa.

Onhan sulla kehityskoneella nämä päällä:

Koodia: [Valitse]
ini_set("display_errors", "1");
ini_set("error_reporting", E_ALL);

Tuleeko virhettä?

Ja tietty se eka kysymys on aina, että onhan apachella kirjoitusoikeus, jotta se voi tallentaa filen.. :-)

Edit: Jos ei jo ole noita virheraportointeja, niin kehityskoneella kannattaa muokata etc/php.ini sen mukaan mitä siellä mallissa on "Development value" suositus.
« Viimeksi muokattu: 28.11.11 - klo:19.09 kirjoittanut odysseus »

Mistofelees

  • Käyttäjä
  • Viestejä: 663
    • Profiili
Vs: ohjelman käynnistymisen rajaus ?
« Vastaus #11 : 29.11.11 - klo:10.13 »

Koodia: [Valitse]
ini_set("display_errors", "1");
ini_set("error_reporting", E_ALL);

Tuleeko virhettä?

Ja tietty se eka kysymys on aina, että onhan apachella kirjoitusoikeus, jotta se voi tallentaa filen.. :-)

Edit: Jos ei jo ole noita virheraportointeja, niin kehityskoneella kannattaa muokata etc/php.ini sen mukaan mitä siellä mallissa on "Development value" suositus.

Hyviä vinkkejä !
Itse olen vasta aloitellut php:n kanssa. Kokemusta vasta muutama sata riviä sorsaa ja sekin ihan luonnonmenetelmällä.
Kun pistin nuo antamasi rivit koodiin mukaan, tuli virheilmo (kone on sisäverkossa eikä näy ulos):
Fatal error: Call to undefined function imagecreatefromjpeg() in /home/www/mistofelees/muokkaa.php on line 34
Kyseinen rivi: $original_image = imagecreatefromjpeg($original_file);

Sopiva ohje löytyi sivulta:
http://www.phpfreaks.com/forums/index.php?topic=205001.0

Kun nämä ajoi, homma lähti toimimaan:
apt-get install php5-gd
sudo /etc/init.d/apache2 restart
php5 -m | grep 'gd'

Teidostojen ja hakemistojen oikeudet pitää tietenkin olla kunnossa. Tässä tapauksessa esim:
-r-------- 1 www-data users 5093 2011-11-28 16:04 showtime.gif

Tuo www-data on Apache2:n 'käyttäjä'. Aikoinaan Apachesta Apache2:een siirryttäessä joutui muuttamaan nämä permissiot kaikille hakemistoille
Nyt pitää vielä irrottaa muokkaamani koodi testisivulta ja siirtää varsinaiseen Album-ohjelmaan.

Tuota etc/php.ini ( /etc/php5/cli/php.ini) ei tarvinnut onneksi puukottaa. Se on hiivatin iso tiedosto.

odysseus

  • Vieras
Vs: ohjelman käynnistymisen rajaus ?
« Vastaus #12 : 30.11.11 - klo:12.37 »
Hyvä jos lähti pelittämään. Tuolla PHP "asennuksessa" kannattaa yleensä olla tuo GD moduli olemassa. Sen lisäksi ainakin seuraavat helpottavat elämää jos ei ole jo asennettu (tuossa siis tuo gd mukana ja mysql varmaan on jo..):

Koodia: [Valitse]
apt-get install php-mysql php-xml php-gd php-mbstring php-posix

Tuota etc/php.ini ( /etc/php5/cli/php.ini) ei tarvinnut onneksi puukottaa. Se on hiivatin iso tiedosto.

Itseasiassa kannattaa vaivautua pikku puukotukseen. Sen kun tekee suoraan sen mukaan mitä siellä on jokaiseen kohtaan ja valkkaa tuon suosituksen mitä Development Value sanoo:

Koodia: [Valitse]
; Default Value: On
; Development Value: Off
; Production Value: Off

Kerran tehty auttaa jatkossa ja paljon! Luonnollisesti sitten siellä oikealla palvelimella pitää olla nuo Production Value:t käytössä.

Tuon lisäksi kannattaa tutustua error handlerin customointiin sillä sen avulla saat käsiteltyä output bufferia (ob_start(), ob_flush() jne) ja saat myös kivoja debuggausta auttavia juttuja, esimerkiksi function backtracen tähän tyyliin:

Koodia: [Valitse]
/**
  Function call backtrace.

  @param context - Current function context
*/
function _error_back_trace($context) {
  $calls = "";
  $trace = debug_backtrace();
  $calls = "\n  Backtrace:";

  for ($x = 2; $x < count($trace); $x++) {
    $callNo = $x - 2;
    $calls .= "\n    {$callNo}: {$trace[$x]['function']} (line {$trace[$x]['line']} in {$trace[$x]['file']})";
  }

  $calls .= "\n  Variables in {$trace[2]['function']} ():";

  foreach ($context as $name => $value) {
    if (!empty($value) && !is_object($value)) {
      if (is_array($value)) {
        $calls .= "\n    {$name} is {$value} with values";
        foreach ($value as $n => $v)
          if (is_array($v)) {
            $calls .= "\n      {$n} is {$v} with subvalues";
            foreach ($v as $a => $b) {
              $calls .= "\n        {$a} is {$b}";
              if (is_array($b))
                $calls .= "\n          Is still an array! Not digging deeper..";
            }
          }
          else {
            $calls .= "\n      {$n} is {$v}";
          }
      }
      else {
        $calls .= "\n    {$name} is {$value}";
      }
    }
    else {
      $calls .= "\n    {$name} is NULL";
    }
  }
  $calls .= "\n";
  return ($calls);
}

Kutsut tuota vain omassa errorhandlerissa, jonka olet asettanut johonkin koodin alkuun jotakuinkin näin:

Koodia: [Valitse]
require_once('my_own_error_handler.php');
set_error_handler("my_error_handler");

Sitten koodaat my_error_handler.php:n tähän tyyliin:

Koodia: [Valitse]
function my_error_handler($number, $string, $file, $line, $context) {
  // Handle error messaging somehow. Ie. separate ERRORS and WARNINGS etc...
  switch ($number) {
     case E_USER_ERROR:
       $error .= date("His") ." - ERROR on line {$line} in {$file}.\n";
       $stop = true;
       if (_VERBOSE)
         $trace = true;
       else
         $trace = false;
       break;
     case E_WARNING:
     case E_USER_WARNING:
       $error .= date("His") ." - WARNING on line {$line} in {$file}.\n";
       $stop = false;
       if (_VERBOSE && _DEBUG)
         $trace = true;
       else
         $trace = false;
       break;
     case E_NOTICE:
     case E_USER_NOTICE:
       $error .= date("His") ." - NOTICE on line {$line} in {$file}.\n";
       $stop = false;
       $trace = false;
       break;
     default:
       $error .= date("His") ." - UNHANDLED ERROR on line {$line} in {$file}.\n";
       $stop = true;
       $trace = true;
  }

  // Show error before backtrace
  if ($stop)
      _error_show_error($error);
  // Trace back function calls for error log
  if ($trace)
    $tracestr = _error_back_trace($context);

  // Log error "somehow somewhere"...
  error_log($error, 3, _PHYSICAL_ERRORLOG_PATH . "E_" . date("Ymd") . ".log");

  if ($stop)
    die();
}

Tuossa alkua malliksi. Osa koodista toki puuttuu tuosta, joten joudut tutkimaan ja lisäilemään hieman juttuja...


Mistofelees

  • Käyttäjä
  • Viestejä: 663
    • Profiili
Vs: ohjelman käynnistymisen rajaus ?
« Vastaus #13 : 05.12.11 - klo:13.36 »
Hyvä jos lähti pelittämään.

Itse asiassa tuli vielä pieni ongelma. Heitin kokeiksi käsittelyyn hakemiston, jossa on 143 kuvaa. Selalin-ikkunaan ilmestyi osa koristeista ja ropelli pyöri hetken, mutta pysähtyi sitten. Ohjelma oli tehnyt osan kuvista ja pysähtynyt. Uudella käynnistyksellä genetotui lisää kuvia jne.

Ilmeisesti selaimen tai Apachen timeout katkaisi toimituksen.
Ei oikein tekisi mieli näitä timeoutteja alkaa muuttamaan, mutta oma ongelmansa tulee tuossa naapurihakemistossa: 1470 kuvaa.

odysseus

  • Vieras
Vs: ohjelman käynnistymisen rajaus ?
« Vastaus #14 : 06.12.11 - klo:12.12 »
Hyvä jos lähti pelittämään.

Itse asiassa tuli vielä pieni ongelma. Heitin kokeiksi käsittelyyn hakemiston, jossa on 143 kuvaa. Selalin-ikkunaan ilmestyi osa koristeista ja ropelli pyöri hetken, mutta pysähtyi sitten. Ohjelma oli tehnyt osan kuvista ja pysähtynyt. Uudella käynnistyksellä genetotui lisää kuvia jne.

Ilmeisesti selaimen tai Apachen timeout katkaisi toimituksen.
Ei oikein tekisi mieli näitä timeoutteja alkaa muuttamaan, mutta oma ongelmansa tulee tuossa naapurihakemistossa: 1470 kuvaa.

set_time_limit() voisi auttaa;
http://php.net/manual/en/function.set-time-limit.php

ja sitten ob_start() ja ob_end_flush() voi myös auttaa määrätyissä tapauksissa, jotta selaimelle ei lähetetä tavaraa liian aikaisin.

Tosin jos tiedostoja tulee palvelimelle jatkuvaan, niin ehkä jokin daemon taustalla voisi olla parempi ratkaisu koko hommaan. Jos sinulla on root oikeudet koneelle, niin äkkiäkös sinne väsää scriptin, joka konvertoi kuvan aina kun hakemistoon sellainen tulee...

Mistofelees

  • Käyttäjä
  • Viestejä: 663
    • Profiili
Vs: ohjelman käynnistymisen rajaus ?
« Vastaus #15 : 07.12.11 - klo:15.40 »
Asialle tuli yhtäkkiä kiire ja löysin ratkaisun tekemällä hätäisesti pienen bash-scriptin. Tätä voisi periaatteessa kutsua jotain muutakin kautta.
Mitenkäs scriptin saisi käynnistettyä, kun hakemiston sisältö muuttuu ?

Koodia: [Valitse]
#!/bin/bash
# Album-ohjelman apuohjelma, ver 3.4.1, generoi 160x160 minikuvat kaikki kerralla png-muotoon.
for x in `ls *[Jj][Pp][Gg] *[Gg][Ii][Ff] *[Pp][Nn][Gg] *[Bb][Mm][Pp]`;
        do
                tx=t_${x/%.*/.png}
                if [ ! -f $tx ] && [ `expr match $x "t_" ` == '0' ] ; then
                        convert -strip -resize 160 $x $tx;
        fi
done
« Viimeksi muokattu: 08.12.11 - klo:09.50 kirjoittanut Mistofelees »

odysseus

  • Vieras
Vs: ohjelman käynnistymisen rajaus ?
« Vastaus #16 : 10.12.11 - klo:13.52 »
Mitenkäs scriptin saisi käynnistettyä, kun hakemiston sisältö muuttuu ?

Vähän huonosti:
http://stefan.buettcher.org/cs/fschange/index.html

Mutta tällä voisi lähteä liikkeelle:
http://linuxadminzone.com/detect-directory-or-file-changes-in-linuxunix

...ja täältä löytyisi alku C-kieliselle versiolle, jolla saat oman daemonin aikaiseksi jos on oikeudet koneeseen asentaa noita:
http://www.linuxquestions.org/questions/programming-9/linux-system-call-to-detect-changes-in-a-directory-22105