PHP-Skript ohne Browser ausführen möglich?

Nein läuft leider nicht. Ich habe meinen Code gelöscht und deinen 1:1 eingebaut. Ich habe nur eine Stelle verändert die falsch* war.

In der Fehlermeldung von Imagick steht:
'Unable to read the file: .svg'

Der kennt den Dateinamen nicht. Also wird $var nicht erkannt oder?

*
PHP:
  $thumb->readImage($var.'svg');   // Falsch (Kein Punkt)
  $thumb->writeImage($var.'png');  // Falsch (Kein Punkt)

  $thumb->readImage($var.'.svg');   // Richtig
  $thumb->writeImage($var.'.png');  // Richtig
 
In solchen Situationen muss man den Pfad der Variable zurückverfolgen.
Dann kommt man darauf, dass $var=$_GET['var'] und somit $_GET['var']='' (also leer) sein muss.

Ja, du kannst noch einen Punkt hinzufügen ;)
Ich hatte nur den Code von oben kopiert, wo keiner war.
 
Ich habe den Code mittlerweilse zumindest PHP-Technisch zum laufen bekommen aber es kommen ein paar Imagick Fehler die irgend etwas mit meinem vBulletin Forum zutun haben.

Das Problem wäre die "Global.php" und die "vbseo.php" aber ist jetzt auch egal.

Gibt es evtl. noch eine Möglichkeit wie ich (so genau wie möglich) prüfen kann wann die konvertierung durchgeführt wurde. Also ob sie durch ist.
 
Welche Fehler kommen denn?


Soweit ich das jetzt aus der Dokumentation entnehmen konnte, läuft Imagick::writeImage synchron ab, sprich wenn die Funktion beendet ist, ist auch die Konvertierung beendet.

Ach du rufst das Skript create_an_svg.php von außerhalb auf?
 
Möglichkeit 1:
Mit jQuery alle paar Sekunden eine Funktion aufrufen, die per Ajax eine PHP-Datei kontaktiert, die diese Prüfung durchführt.

Möglichkeit 2:
Eine Schleife in PHP, wobei ich hier einen Trick anwenden würde:
PHP:
$e = 10000000;
for($i=1; $i > $e; $i++)
{
      //Check ausführen

     sleep(5); //5sek. warten bis die Schleife nochmal durchlaufen wird... sonst kommts mit Sicherheit zur Überlastung des Servers.
}
Allerdings könnte das irgendwie zu einem Timeout führen, weil das Script ja nur eine gewisse Zeit lang ausgeführt wird...

Möglichkeit 1 ist sicher schicker. ;)
 
Welche Fehler kommen denn?


Soweit ich das jetzt aus der Dokumentation entnehmen konnte, läuft Imagick::writeImage synchron ab, sprich wenn die Funktion beendet ist, ist auch die Konvertierung beendet.

Das sind die Fehlermeldungen (etwas übersichtlicher gestaltet!):
Fatal error:
Uncaught exception 'ImagickException' with message 'Unable to read the file: svglol.svg' in /www/htdocs/w00k22e/makesvg/svg2png.php:5 Stack trace:

#0 /www/htdocs/w00k22e/makesvg/svg2png.php(5): Imagick->readimage('svgtest.svg')
#1 /www/htdocs/w00k22ef/makesvg/svg_generator.php(1182): bl5000_func('svgtest')
#2 /www/htdocs/w00k22e/global.php(400) : eval()'d code(245): require_once('/www/htdocs/w00...')
#3 /www/htdocs/w00k22e/global.php(400): eval()
#4 /www/htdocs/w00k22e/makesvg/vb_svg_generator.php(11): require_once('/www/htdocs/w00...')
#5 /www/htdocs/w00k22e/vbseo.php(1397): require('/www/htdocs/w00...')
#6 {main} thrown in /www/htdocs/w00k22e/makesvg/svg2png.php on line 5

Dieser Fehler kommt NUR wenn ich es mit meinem Forum "verknüpfe". Sonst funktioniert es perfekt.

Hier ne kurze Erklärung zu den Punkten:
svg_generator.php ist der SVG-Generator

global.php ist von vBulletin (hat dieses Forum auch)

vb_svg_generator.php ist eine PHP-Datei die praktisch als "Ehering" zwischen vBulletin und meinem Skript ist. Hier wird auch die Global.php geladen. Hier wird auch mein Skript geladen.

Edit:

Ich habe mal ein bisschen rumgebastelt und dabei ist dieser Fehlerhafte PHP-Code entstanden.

PHP:
   if(file_exists("new-svg.png")) {
      $pruef = 'Ja';
      echo 'PNG ist fertig. Anlauf Nr.1<br />';
   }
      else
   {
      $pruef = 'Nein';
      echo 'PNG ist nicht fertig. Anlauf Nr.1<br />';
      sleep(2);
   }

   if($pruef == 'Nein') {
      if(file_exists("new-svg.png")) {
         $pruef = 'Ja';
         echo 'PNG ist fertig. Anlauf Nr.2<br />';
      }
   }
      else
   {
      $pruef = 'Nein';
      echo 'PNG ist nicht fertig. Anlauf Nr.2<br />';
      sleep(2);
   }

   if($pruef == 'Nein') {
      if(file_exists("new-svg.png")) {
         $pruef = 'Ja';
         echo 'PNG ist fertig. Anlauf Nr.3<br />';
      }
   }
      else
   {
      $pruef = 'Nein';
      echo 'PNG ist nicht fertig. Anlauf Nr.3<br />';
      sleep(10);
   }

Das kommt raus (Ich habe die PNG extra vorher gelöscht):
PHP:
PNG ist fertig. Anlauf Nr.1
PNG ist nicht fertig. Anlauf Nr.2
PNG ist fertig. Anlauf Nr.3

Edit:

Welche Fehler kommen denn?


Soweit ich das jetzt aus der Dokumentation entnehmen konnte, läuft Imagick::writeImage synchron ab, sprich wenn die Funktion beendet ist, ist auch die Konvertierung beendet.

Ach du rufst das Skript create_an_svg.php von außerhalb auf?

Wie?

Momentan sind die PHP-Dateien "svn2png.php" und "create_a_svg.php" im selben Verzeichnis gespeichert. Sobald alles läuft, wollte ich "create_a_svg.php" eine Ebene drunter einbauen.

So ist es:
Ordner 1
Ordner 1 -> svn2png.php
Ordner 1 -> create_a_svg.php

So soll es später werden:
Ordner 1
Ordner 1 -> svn2png.php
Ordner 1 -> Ordner 2 -> create_a_svg.php

Das ich den Imagick Code nicht direkt im Skript ausführen kann, liegt 100% an vBulletin. Ich weiss zwar nicht warum aber ich bin mir sicher das es so ist. In jeder anderen Datei funktioniert es nähmlich perfekt.
 
Zuletzt bearbeitet:
Du hast hier einen Klammerdreher drin:
PHP:
if($pruef == 'Nein') {
      if(file_exists("new-svg.png")) {
         $pruef = 'Ja';
         echo 'PNG ist fertig. Anlauf Nr.2<br />';
      }
   }
      else
   {
      $pruef = 'Nein';
      echo 'PNG ist nicht fertig. Anlauf Nr.2<br />';
      sleep(2);
   }

Es sollte aber auch die else-Abfrage ausgeführt werden, wenn pruef=='nein'.

PHP:
if($pruef == 'Nein') {
      if(file_exists("new-svg.png")) {
         $pruef = 'Ja';
         echo 'PNG ist fertig. Anlauf Nr.2<br />';
      }
      else
      {
         $pruef = 'Nein';
         echo 'PNG ist nicht fertig. Anlauf Nr.2<br />';
         sleep(2);
      }
}

Ich frage mich, wieso du keine Schleife machst?

PHP:
$e = 100;
for($i=1; $i<$e; $i++)
{
    if(file_exists("new-svg.png"))
    {
        echo "PNG fertig. {$i}ter Versuch.";
        break;
    } else {
        echo "PNG nicht fertig. {$i}ter Versuch.";
        sleep(2);
    }
}

Du könntest das Prinzip auch noch erweitern...

PHP:
$e = 2;
for($i=1; $i<$e; $i++)
{
    if(file_exists("new-svg.png"))
    {
        echo "PNG fertig. {$i}ter Versuch.";
        break;
    } else {
        echo "PNG nicht fertig. {$i}ter Versuch.";
        sleep(2);
        $e++;
    }
}
So wird es zu einer unendlichen Schleife, bis das Bild fertig ist - könnte aber zu einem Timeout führen, bzw. tut es mit Sicherheit, wenn es zu lange dauert.
 
Zuletzt bearbeitet:
So wird es zu einer unendlichen Schleife, bis das Bild fertig ist - könnte aber zu einem Timeout führen, bzw. tut es mit Sicherheit, wenn es zu lange dauert.

Ich werde es gleich mal direkt ausprobieren. Danke dafür!

Kann ich einen Timeout nicht selber verlängern mit einem Befehl wie z.B. "set_time_limit(120)"? Sehr gut wäre wenn auch noch eine von mir festgelegte Info wie "Internes Server Problem" oder so ausgegeben werden würde, wenn das Skript in den Timeout rutscht.
 
Du kannst gleich -1 nutzen:
PHP:
set_time_limit(-1);
Dann kann dein Skript bis zum nächsten Stromausfall laufen.

Es scheint, als ob global.php dein Code mittels [phpf]eval[/phpf] ausführt und es somit zu den Fehlern kommt.
 
Ach echt?

Ich habe eben gelesen das man den "set_time_limit" nicht bei jedem Hoster benutzen kann. Bei mir läuft der Server NICHT im Safe-Modus. Bedeutet dies das ich auf jeden Fall diesen Befehl benutzen kann?
 
Zurück