Magento 1.9.1 cron_schedule ไม่ได้ถูกเลือกมานาน


12

ฉันใช้เวลาเกือบ 3 วันและไม่สามารถเข้าใจและทำให้ Magento Cron ดำเนินงานตามกำหนดเวลาได้ ฉันใช้ Magento 1.9.1.0 และเมื่อไม่นานมานี้พบว่าอีเมลคำสั่งซื้อถูกจัดคิวแทนที่จะส่งทันที ฉันเข้าใจความจำเป็น แต่ไม่สามารถทำให้ระบบเลือกคิวได้

นี่คือสิ่งที่ฉันเห็นสำหรับ Cronjob ป้อนคำอธิบายรูปภาพที่นี่

นี่คือบรรทัดคำสั่ง cronjob ของฉัน ป้อนคำอธิบายรูปภาพที่นี่

นี่คือวิธีการสร้างงานในตาราง cron_schedule ป้อนคำอธิบายรูปภาพที่นี่

เนื่องจากบันทึกถูกสร้างขึ้นในตาราง cron_schedule ฉันคิดว่า Cron กำลังทำงานหนึ่งครั้งในทุก ๆ 5 นาที ถ้าฉันลบระเบียนเหล่านี้ด้วยตนเองผ่านทาง PhpMyAdmin ระเบียนจะถูกสร้างขึ้นโดยอัตโนมัติหลังจากเวลาผ่านไปสักครู่

แต่สถานะของงานยังคง 'รอดำเนินการ' และไม่เสร็จสมบูรณ์ ไม่แน่ใจว่ามีอะไรผิดปกติในการกำหนดค่าของฉันหรือฉันหายไปอะไร ใครช่วยได้โปรดช่วยฉันทำอย่างไรให้งานที่กำหนดเวลาทำงานตรงเวลา ทำไมจึงสร้างหลายระเบียนสำหรับรหัสงานหนึ่งรหัส

ปรับปรุง

ฉันล้างตารางทั้งหมดและ cron สร้างงานที่กำหนดเวลาไว้ งานทั้งหมดอยู่ในสถานะรอดำเนินการและไม่เคยทำงานแม้แต่จะรอนานกว่า 60 นาที มีบางอย่างผิดปกติใน Magento 1.9.1

อัปเดต 11/02: วันนี้ฉันทำการวิเคราะห์เพิ่มเติมเกี่ยวกับกระบวนการ

ฉันแก้ไข cron.php ดังนี้

echo 'iam before mdefault 1';
shell_exec("/bin/sh $baseDir/cron.sh $fileName -mdefault 1 > /dev/null 2>&1 &");
echo 'iam before malways 1';
shell_exec("/bin/sh $baseDir/cron.sh $fileName -malways 1 > /dev/null 2>&1 &");
echo 'i returned success';

ฉันแก้ไขคลาส Mage_Cron_Model_Observer ดังนี้

public function dispatch($observer) {
  echo 'iam inside dispath';

ความเข้าใจของฉันคือเมื่อ cron รัน -mdefault มันควรจะเรียกฟังก์ชั่นการจัดส่งและรันจะเกิดขึ้น แต่สิ่งที่เกิดขึ้นคือด้านล่างในเอาต์พุต cron

Content-type: text/html

iam before mdefault 1iam before malways 1i returned success

มันหมายถึงการจัดส่งไม่ได้เรียกว่า atall ...

ลองอีกวิธีหนึ่ง

ฉันเปลี่ยนตัวแปรด้วยตนเอง$isShellDisabled = true;และฉันเปลี่ยนด้านล่างเป็น cron.php

if ($isShellDisabled) {
  echo 'before always';
  Mage::dispatchEvent('always');
  echo 'after always';
  Mage::dispatchEvent('default');
  echo 'after default';
} else {
  Mage::dispatchEvent($cronMode);
}

เอาต์พุต cron สำหรับด้านบนมีดังนี้

Content-type: text/html

before alwaysiam inside dispath alwaysafter always

ตอนนี้มันเรียกว่า 'dispatchAlways' แต่ไม่ใช่ 'dispatch'

ไม่มีคำตอบที่ช่วยฉันได้ มันไม่เคยเลือกงานที่กำหนด คือเมื่อ Cron รันเป็นครั้งแรกมันจะสร้างงานในตารางได้สำเร็จ แต่มันไม่เคยดำเนินงาน


จะเกิดอะไรขึ้นเมื่อคุณเรียกใช้ cron.php จากเว็บเบราว์เซอร์ มันจะเป็นหน้าเปล่า แต่ฉันหมายถึงว่าเกิดอะไรขึ้นกับภารกิจ cron ของคุณ
seanbreeden

ลองใช้สคริปต์ทุบตี: */5 * * * * /bin/sh PATH_TO_PRODUCTION/cron.shถ้ามี
Phil Birnie

@ seanbreeden เมื่อฉันเรียกใช้ผ่าน URL บนเบราว์เซอร์จะแสดงหน้าว่าง ไม่มีอะไรที่ได้เกิดขึ้นกับงานที่ .. ฉันปรับปรุงคำถามกับชุดใหม่ของงานสร้าง ...
Malaiselvan

@PhilB, .sh ไม่ได้สร้างความแตกต่าง มันคล้ายกับงานที่รอดำเนินการซึ่งรอดำเนินการมานาน แต่ฉันแน่ใจว่า cron กำลังทำงานทุก 5 นาที
Malaiselvan

คุณพยายามล้างcron_scheduleตารางหรือไม่? ตรวจสอบว่ามันเต็มไปด้วยงานใหม่หลังจากผ่านไปหนึ่งชั่วโมงหรือไม่
Sander Mangel

คำตอบ:


3

มันเป็นรุ่น PHP ของ Cron Jobs

เวอร์ชัน PHP ถูกตั้งค่าอย่างถูกต้องสำหรับเว็บไซต์ซึ่งเป็นสาเหตุที่มันทำงาน แต่ Cron Jobs ทำงานที่เซิร์ฟเวอร์พื้นเมือง PHP 5.3 ซึ่งเป็นสาเหตุที่ฉันได้รับข้อผิดพลาดเฉพาะเมื่อใช้ Cron ฉันอัพเดทเป็นเวอร์ชั่น 5.5

เปลี่ยนคำสั่ง Cron:

php /home/mydomainname/public_html/cron.php
to
php55 /home/mydomainname/public_html/cron.php

หรือใน hostgator:

/opt/php55/bin/php /home/mydomainname/public_html/cron.php

ใน cron.php

$isShellDisabled = (stripos(PHP_OS, 'win') === false) ? $isShellDisabled : true;

หลังจากบรรทัดนี้เพิ่ม:

$isShellDisabled = true;

การกล่าวถึงการรัน cron.php ในรุ่น PHP เฉพาะ (ea-php70 ในกรณีของฉัน) แก้ไขปัญหาที่ฉันพบ: รันphp -vใน terminal เพื่อดูว่าเวอร์ชัน PHP ที่เทอร์มินัลใช้อยู่ ในกรณีของฉันคือ 5.6 ดังนั้นผมจึงต้องบังคับใช้ PHP 7.0 โดยการเปลี่ยนphpไปในea-php70 crontab -eขอบคุณ!
Daan van den Bergh

2

คุณพยายามล้างcron_scheduleตารางหรือไม่? ตรวจสอบว่ามันเต็มไปด้วยงานใหม่หลังจากหนึ่งชั่วโมงหรือมากกว่านั้น

นอกจากนี้คุณสามารถใช้Aoe_Schedulerเพื่อปิดการใช้งาน cronjobs ที่เฉพาะเจาะจง ดูว่ามีสิ่งใดที่ทำให้เกิดข้อผิดพลาดที่จะหยุดงานอื่น ๆ ทั้งหมดหรือไม่

วิธีที่วีโอไอพี cronjobs ตั้งค่าข้อผิดพลาดร้ายแรงในสคริปต์จะทำให้การทำงานทั้งหมดล้มเหลว


ขอบคุณสำหรับคำตอบ. ข้อผิดพลาดร้ายแรงที่จับในบันทึกใด ๆ ฉันอัปเดตการค้นพบเพิ่มเติมอีกสองสามรายการในเคสของฉันและอัพเดตคำถามเดียวกัน
Malaiselvan

@ seanbreeden: วันนี้ฉันสังเกตเห็นว่าเมื่อฉันเปิด Cron.php ผ่านทางเว็บเบราว์เซอร์มันใช้งานได้ดีโดยเลือกตาราง สิ่งนี้พิสูจน์ว่าไม่มีข้อผิดพลาดร้ายแรงในสคริปต์ใด ๆ ความคิดใดที่ cron ไม่ทำงานผ่าน crontab?
Malaiselvan

2

เป็นขั้นตอนแรกฉันขอแนะนำให้คืนค่าการตั้งค่ากลับเป็นค่า cron เริ่มต้นของ Magento:

Magento Cron Defaults

มีปัญหากับการตั้งค่าปัจจุบันของคุณ: กำหนดการของคุณจะถูกสร้างขึ้นทุก ๆ 15 นาที แต่จะมีการกำหนดไว้ล่วงหน้าเป็นเวลา 5 นาทีซึ่งจะทำให้เกิดช่องว่าง 10 นาที


ขอบคุณ แม้หลังจากที่ฉันรีเซ็ตเป็นค่าเริ่มต้นแล้วมันก็ไม่ทำงาน เมื่อครั้งแรกที่มันรันมันจะสร้างงานทั้งหมดในตาราง cron_schedule พร้อมกับเวลาที่กำหนดไว้ งานจะไม่ถูกเลือกและอยู่ในตารางเป็นรอตลอด สิ่งหนึ่งที่ฉันสังเกตเห็นหลังจากการตั้งค่า$isShellDisabled = true;และเมื่อฉันเปิด Cron.php ผ่านเบราว์เซอร์งานจะถูกเลือก แต่ไม่ใช่ผ่าน CronTab
Malaiselvan

ปัญหานี้ยังไม่ได้รับการแก้ไข จะมีปัญหากับผู้ให้บริการโฮสต์ของฉันหรือไม่ ฉันเห็นสคริปต์ถูกเรียกใช้งานเป็นระยะ ๆ แต่ไม่ได้เลือกเฉพาะงาน มันจะเป็นปัญหาด้วยหรือไม่ตั้งแต่ฉันย้ายจาก 1.8?
Malaiselvan

cronjob ของคุณมีหน่วยความจำเพียงพอหรือไม่ ลองบันทึกข้อผิดพลาดเพื่อดูว่ามีสิ่งใดในนั้นที่สามารถช่วยได้
Kristof ที่ Fooman

ปัญหานี้ยังไม่ได้รับการแก้ไข ... ทุกวันที่ฉันแหกปาก บันทึกข้อผิดพลาด ฉันจะดูสิ่งเหล่านั้นได้ที่ไหน
Malaiselvan

@Malaiselvan สำหรับบันทึกข้อผิดพลาดโปรดตรวจสอบกับผู้ดูแลระบบหรือเว็บโฮสต์ของคุณเพราะพวกเขาควรรู้ตำแหน่งและวิธีการเข้าถึงบันทึกข้อผิดพลาดของเซิร์ฟเวอร์ นอกจากนี้ยังอาจช่วยในการรันงาน cron ด้วยตนเองจากบรรทัดคำสั่ง - ลองทั้งสองphp -f cron.phpและ./cron.shดูว่าพวกเขาผลิตอะไรเพื่อตรวจสอบเพิ่มเติม
Kristof ที่ Fooman

1

ปัญหาเดียวกันสำหรับฉัน

พบข้อผิดพลาด "สายเกินไป ... "

หลังจากทำความสะอาดcron_scheduleโต๊ะ cron.sh หยุดทำงาน (ไม่ได้กำหนดเวลาอีกต่อไป)

ทำงานได้หลังจากฆ่ากระบวนการ Cron เก่าทั้งหมดเท่านั้น


ในกรณีของฉันเมื่อ Cron ทำงานเป็นครั้งแรกมันก็สร้างงานในตารางได้สำเร็จ แต่มันไม่เคยดำเนินงาน :-(
Malaiselvan

1

ผมมีปัญหาเหมือนกัน. ปัญหาของฉันเฉพาะโซนเวลา: คอลัมน์created_atและscheduled_atในcron_scheduleตารางควรเป็น UTC + 0 รายการของฉันคือ UTC + 2

ในการตรวจสอบสิ่งนี้คุณสามารถตั้งค่าวันที่created_atและเวลาscheduled_atเมื่อวานและรอจนกว่าจะถึงกำหนดการ cron ถัดไป

หวังว่าจะช่วยให้ใครบางคน!


1

บน Bluehost ใน cron.sh เปลี่ยน

 PHP_BIN=`which php`

ถึง

 PHP_BIN="php54s"

โดยค่าเริ่มต้นในการโฮสต์ที่ใช้ร่วมกันนั้นจะรัน PHP 5.2

ฉันต้องเปลี่ยนcron.phpโดยแทนที่สอง$isShellDisabledบรรทัดด้วย $isShellDisabled = true;

เพื่อกำจัดคำเตือน PHP ฉันยังเพิ่มบรรทัดเหล่านี้ก่อน

$_SERVER['SCRIPT_NAME'] = 

if (empty($_SERVER['SCRIPT_FILENAME'])) $_SERVER['SCRIPT_FILENAME'] = '~/public_html/cron.php';
if (empty($_SERVER['SCRIPT_NAME'])) $_SERVER['SCRIPT_NAME'] = '/cron.php';
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.