CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken |
04.10.2012, 10:36:44
|
Anfänger
|
|
Registriert seit: Jan 2007
Beiträge: 4
|
|
Problem mit Skript aus CRON
Hallo zusammen,
vielleicht hat hier jemand bereits das selbe Problem gehabt.
Kurz zur Beschreibung:
Ich führe ein PHP-Skript zur Übernahme von Daten aus einem ORACLE-Server in eine MySQL-DB aus. Dabei tritt folgendes Problem auf:
Obwohl das Skript durchläuft, werden nicht alle Daten übernommen. Führe ich das Skript von der Shell, unter dem selben benutzer ( root ) aus, werden alle Datensätze verarbeitet.
In beiden Fällen wird keine Fehlermeldung ausgegeben ( E_ALL ), es fehle einfach Daten, wenn über CRON ausgeführt.
Vielleicht gibt es einen Ansatz zur Lösung des Problemes.
Vorerst Danke.
|
04.10.2012, 11:56:00
|
Member
|
|
Registriert seit: Nov 2007
Beiträge: 843
|
|
AW: Problem mit Skript aus CRON
Hi,
Zitat:
Obwohl das Skript durchläuft
|
Laufzeit beider Scripte identisch?
Wieviele von wievielen?
Zitat:
unter dem selben benutzer ( root )
|
Sicher? Hab schon viele Server erlebt die Crons nicht
als root ausführen.
Gern darfst du auszüge des Crons zeigen.
mfg
CKaos
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
|
04.10.2012, 14:11:39
|
Anfänger
|
|
Registriert seit: Jan 2007
Beiträge: 4
|
|
AW: Problem mit Skript aus CRON
Hallo,
die Laufzeit beider Skripts ist identisch.
Es fehlen ca. 2/3 der Daten, die importiert werden sollen. ein Fehler lässt sich nicht feststellen.
und ...
der Benutzer ist sicher 'root' .
Mir ist das Ganze ein Rätsel, zumal das Skript bis vor ein paar Tagen noch funktioniert hat. Die einzige Änderung seit dem ist die Anzahl der Daten, die importiert werden. Wobei das Problem nicht nur bei den 'neuen' Datensätzen auftritt sondern sich auf allen Datensätze auswirkt.
Klingt komisch -- ist es auch ;-)
|
04.10.2012, 16:58:53
|
|
SELFPHP Guru
|
|
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
|
|
AW: Problem mit Skript aus CRON
Zitat:
Zitat von magast
Vielleicht gibt es einen Ansatz zur Lösung des Problemes.
|
1. wie sieht das Script incl. shebang Zeile und OHNE Logindaten aus?
2. wie wird das CLI (?) Script aufgerufen? Bitte die komplette Zeile aus dem crontab.
3. welche PHP Version?
4. welche Config verwendet das Script?
|
05.10.2012, 08:10:49
|
Anfänger
|
|
Registriert seit: Jan 2007
Beiträge: 4
|
|
AW: Problem mit Skript aus CRON
Guten Morgen,
vielen Dank für den Hilfeversuch.
Hier dei benötigten Informationen:
PHP-Version:
Code:
PHP 5.2.4 (cli) (built: Oct 16 2007 09:21:24)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
with Zend Extension Manager v1.2.2, Copyright (c) 2003-2007, by Zend Technologies
with Zend Optimizer v3.3.0, Copyright (c) 1998-2007, by Zend Technologies
Cron-Zeile: ( wird manuell genau so verwendet )
Code:
0 5 * * 1-5 /usr/bin/php -f /xxxx/xxxx/www/htdocs/intranet/components/com_adlmischrez/rez_import.php > /tmp/rezimport.log
Config (ausserhalb der PHP.ini):
Code:
error_reporting(E_ALL);
ini_set('display_errors', 'Off');
ini_set('log_errors', 'On');
ini_set('error_log', '/var/log/phperrors.log');
// Speichergrenze erhöhen
ini_set("memory_limit", "60M");
Im Skript selbst werden dann nur DB-Zugriffe ausgeführt. Tabelleninhlate werden zuerst gelöscht und dann komplett neu mittels INSERT eingefügt. Als DB-Schnittstelle wird PEAR-DB verwendet.
Da die Datensätze in den beiden Tabellen unterschiedliche Strukturen aufweisen, mehrere Datensätze in der Quell-Tabelle bilden einen Datensatz in der Zieltabelle, arbeite ich mit einem Array, das befüllt wird und bei Änderung eines bestimmten Kriteriums per INSERT in die Zieltabelle übergeben wird.
Vielleicht liegt hier der Fehler. Wie gesagt tritt der Fehler erst seit der Erhöhung der Anzahl der Datensätze in der Quelltabelle auf.
Ich suche weiter.
|
05.10.2012, 09:42:33
|
Member
|
|
Registriert seit: Nov 2007
Beiträge: 843
|
|
AW: Problem mit Skript aus CRON
Hi
Zitat:
arbeite ich mit einem Array, das befüllt wird und bei Änderung eines bestimmten Kriteriums per INSERT in die Zieltabelle übergeben wird
|
Denke hier wird auch dein Fehler liegen. Aber ohne Code können wir dir
da nicht helfen.
mfg
CKaos
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
|
05.10.2012, 11:25:53
|
Anfänger
|
|
Registriert seit: Jan 2007
Beiträge: 4
|
|
AW: Problem mit Skript aus CRON
Hi
Hier ist jetzt der Code:
Zumindest der, der die Verabeitung macht.
Code:
foreach($result as $key => $value){
$sachnummer = $value['REZEPT'];
if($value['MENGE'] == 0){
continue;
}
if($sachnummer != $aktsachnummer){
if(isset($fields)){
$insertsql = "insert into jos_adlmischrez set id = ".$rezcounter."," .
"artikeltyp = '".$fields['artikeltyp']."', " .
"sachnummer = '".$fields['sachnummer']."', " .
"teilnr = '".mysql_escape_string($fields['rezeptbezeichnung'])."', " .
"subnr1 = '".$fields['subnr1']."', " .
"subbez1 = '".$fields['subbez1']."', " .
"mng1 = '".$fields['mng1']."', " .
"subnr2 = '".$fields['subnr2']."', " .
"subbez2 = '".$fields['subbez2']."', " .
"mng2 = '".$fields['mng2']."', " .
"subnr3 = '".$fields['subnr3']."', " .
"subbez3 = '".$fields['subbez3']."', " .
"mng3 = '".$fields['mng3']."', " .
"subnr4 = '".$fields['subnr4']."', " .
"subbez4 = '".$fields['subbez4']."', " .
"mng4 = '".$fields['mng4']."', " .
"subnr5 = '".$fields['subnr5']."', " .
"subbez5 = '".$fields['subbez5']."', " .
"mng5 = '".$fields['mng5']."', " .
"subnr6 = '".$fields['subnr6']."', " .
"subbez6 = '".$fields['subbez6']."', " .
"mng6 = '".$fields['mng6']."', " .
"subnr7 = '".$fields['subnr7']."', " .
"subbez7 = '".$fields['subbez7']."', " .
"mng7 = '".$fields['mng7']."', " .
"subnr8 = '".$fields['subnr8']."', " .
"subbez8 = '".$fields['subbez8']."', " .
"mng8 = '".$fields['mng8']."', " .
"subnr9 = '".$fields['subnr9']."', " .
"subbez9 = '".$fields['subbez9']."', " .
"mng9 = '".$fields['mng9']."', " .
"subnr10 = '".$fields['subnr10']."', " .
"subbez10 = '".$fields['subbez10']."', " .
"mng10 = '".$fields['mng10']."'";
// if ($debug) print $fields['sachnummer']." ->>- ".$fields['rezeptbezeichnung']."\n";
if($debug) print_r($fields)."\n";
$mysql->query($insertsql);
}
$fields = array();
$fields = array('sachnummer' => '', 'artikeltyp' => '', 'rezeptbezeichnung' => '', 'subnr1' => '', 'subbez1' => '', 'mng1' => '', 'subnr2' => '', 'subbez2' => '', 'mng2' => '', 'subnr3' => '', 'subbez3' => '', 'mng3' => '', 'subnr4' => '', 'subbez4' => '', 'mng4' => '', 'subnr5' => '', 'subbez5' => '', 'mng5' => '', 'subnr6' => '', 'subbez6' => '', 'mng6' => '', 'subnr7' => '', 'subbez7' => '', 'mng7' => '', 'subnr8' => '', 'subbez8' => '', 'mng8' => '', 'subnr9' => '', 'subbez9' => '', 'mng9' => '', 'subnr10' => '', 'subbez10' => '', 'mng10' => '');
$fields['sachnummer'] = $sachnummer;
$fieldcounter = 1;
$rezcounter++;
$aktsachnummer = $sachnummer;
}
else {
$fieldcounter++;
}
$artikelpart = explode(' ',$value['REZEPTBEZ1']);
switch($artikelpart[0]){
case 'XXXXX':
$artikeltyp = 'XXXXRYL';
break;
case 'XXXXXXXX.':
$artikeltyp = 'XXXXXLACK';
break;
default:
$artikeltyp = $artikelpart[0];
}
$fields['artikeltyp'] = $artikeltyp;
$teilnr = reducestring($value['REZEPTBEZ1'], 'teilenr');
if(trim($value['REZEPTBEZ2']) != ''){
$teilnr .= " | ".$value['REZEPTBEZ2'];
}
$teilnr = iconv( "UTF-8", "ISO-8859-1",$teilnr);
$fields['rezeptbezeichnung'] = $teilnr;
$fields['subnr'.$fieldcounter] = $value['TEILENR'];
$subbez = iconv( "UTF-8", "ISO-8859-1",reducestring($value['TEILEBEZ1'], 'teilenr'));
$fields['subbez'.$fieldcounter] = $subbez;
$fields['mng'.$fieldcounter] = strtr($value['MENGE'],',','.');
}
|
05.10.2012, 14:03:18
|
|
SELFPHP Guru
|
|
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
|
|
AW: Problem mit Skript aus CRON
Zitat:
Zitat von magast
PHP-Version:
Code:
PHP 5.2.4 (cli) (built: Oct 16 2007 09:21:24)
|
Älter als die Steinkohle.
Zitat:
Cron-Zeile: ( wird manuell genau so verwendet )
Code:
0 5 * * 1-5 /usr/bin/php -f /xxxx/xxxx/www/htdocs/intranet/components/com_adlmischrez/rez_import.php > /tmp/rezimport.log
|
Ungünstig. Ich hatte gedacht, es wäre ein direkter Eintrag in /etc/crontab, der den Usernamen beinhaltet, mit dessen Rechten das Script ausgeführt werden soll. Beispiel:
Code:
* * * * * root /irgendwo/irgendwas >/dev/null 2>&1
Noch ungünstiger ist, daß es kein direkt ausführbares CLI Shellscript ist, weil es kein execute Flag hat und keine shebangzeile. Beispiel:
Code:
#!/usr/bin/php -c /etc/php5/cli/root.ini -q
<?php
Wichtig ist, daß nach dem -q ein Leerzeichen und ein Linux-Zeilenumbruch folgt. Wird das nicht beachtet, kommt "bad interpreter". Ich tippere deshalb die shebang Zeile immer mit dem MC in der Linuxshell. Spart wilde Flüche.
Zitat:
Config (ausserhalb der PHP.ini):
|
Für sowas verwendet man eine separate php.ini, welche das enthält, was man benötigt. Spart unnötige ini_set im Script.
Generelle Frage: wird include oder require verwendet? Gibt Probleme, weil das Arbeitsverzeichnis anders ist als beim "normalen Webserverscript".
Zitat:
Wie gesagt tritt der Fehler erst seit der Erhöhung der Anzahl der Datensätze in der Quelltabelle auf.
|
Da fehlt also Scriptspeicher, den der root locker kriegt. Wird das Script aber nicht vom root ausgeführt, fehlt das Recht dazu.
Ggf. solltest Du auch mal an eine sequenzielle Verwurstung der Datensätze denken:
- hole einen Record von Oracle
- mach was damit
- und per INSERT oder REPLACE nach MySQL
Spart Speicher, weil nur ein einsamer Datensatz bearbeitet wird.
Falls Du Zugriff auf den Oracle Server hast (und die Kenntnisse dazu):
Oracle bietet eine interne Programmiersprache: http://de.wikipedia.org/wiki/PL/SQL
Damit kannste einige Feinheiten erledigen, die Dir tonnenweise PHP ersparen.
MySQL 5 kann nur eine Untermenge davon. PostgreSQL wäre besser geeignet, weil es PL/pgSQL anbietet.
|
18.01.2013, 10:56:18
|
Anfänger
|
|
Registriert seit: Sep 2010
Ort: Sünching bei Straubing - Regenburg
Alter: 51
Beiträge: 17
|
|
Menge in $result beachten
Hallo,
beachte unbedingt die Tipps von meikel, damit Dein Scipt auch als ShellScript richtig läuft.
Desweiteren noch ein Tipp:
Bei richtig vielen DB-Einträgen kann dir php 'ein paar' Einträge 'verschlucken',
deshalb:
1.) prüfe die Anzahl der Einträge in der DB (mysql>SELECT COUNT(*)...)
mit den Einträgen in $result(php>...count($result)...)
2.) als Lösung:
verarbeite die Einträge 'häppchenweise' (z.B. limit auf 500,10000,20000 Einträge) wie mySQLDumper und Co.
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 13:11:30 Uhr.
|