2016-04-07 5 views
0

Ben cronjobs yöneticisi olarak PDO ile Jobby kullanmaya çalışıyorum. Kapamama serileştirmek ve veritabanına eklemek için SuperClosure (Jobby tarafından da kullanıldı) kullandım. Sonra benim veritabanından tüm kayıtları almak ve jobby için iş olarak eklemeden önce kapatılması unseralize ama elde ettiğin:Jobby/SuperClosure çalışmıyor: "...: eval() 'd code" kapağını içeren dosya mevcut değil

kök @ testi:/home /.../ public_html/kamu #/usr/local/bin/php ./cron.php PHP Uyarı: Kapatmanın seri hale getirilmesi başarısız oldu: "/home/.../public_html/vendor/jeremeamia/SuperClosure/src/SerializableClosure.php(210) kapağını içeren dosya: eval() 'd kodu "mevcut değil. on line /home/.../public_html/vendor/jeremeamia/SuperClosure/src/SerializableClosure.php 117
Bildirim: kapanması Serile başarısız oldu: dosya kapatma içeren, "/home/.../ public_html/vendor/jeremeamia/SuperClosure/src/SerializableClosure.php (210): eval() 'd kodu' mevcut değil.

$config = array(
    'output' => ROOT_PATH . 'closure.log', 
    'debug' => 1, 
); 
$jobby = new Jobby\Jobby($config); 
$serializer = new SuperClosure\Serializer(); 

$jobs = $model->getCronJobs(); 
foreach ($jobs as $job) 
{ 
    $job = array_filter($job); 

    try { 
     $job['closure'] = $serializer->unserialize($job['closure']); 
     unset($job['command']); 
    } catch (SuperClosure\Exception\ClosureUnserializationException $e) { 
    } 

    $jobName = $job[ 'name' ]; 
    unset($job[ 'name' ]); 
    unset($job[ 'id' ]); 

    $jobby->add($jobName, $job); 
} 

$jobby->run(); 

Ya ben: İşte

benim kodudur hattında /home/.../public_html/vendor/jeremeamia/SuperClosure/src/SerializableClosure.phpyılında $model->getCronJobs(); aldığım:

array(1) { 
    [0]=> 
    array(23) { 
     ["id"]=> 
     string(2) "11" 
     ["name"]=> 
     string(9) "testzcron" 
     ["command"]=> 
     string(1) " " 
     ["closure"]=> 
     string(243) "C:32:"SuperClosure\SerializableClosure":197:{a:5:{s:4:"code";s:                                        102:"function() { 
     echo 'I\'m a function (' . date('Y-m-d H:i:s') . ')!' . PHP_EOL; 
     return true; 
     };";s:7:"context";a:0:{}s:7:"binding";N;s:5:"scope";N;s:8:"isStatic";b:0;}}" 
     ["schedule"]=> 
     string(9) "* * * * *" 
     ["mailer"]=> 
     string(4) "smtp" 
     ["maxRuntime"]=> 
     NULL 
     ["recipients"]=> 
     NULL 
     ["smtpHost"]=> 
     NULL 
     ["smtpPort"]=> 
     NULL 
     ["smtpUsername"]=> 
     NULL 
     ["smtpPassword"]=> 
     NULL 
     ["smtpSender"]=> 
     string(15) "[email protected]" 
     ["smtpSenderName"]=> 
     string(5) "Jobby" 
     ["smtpSecurity"]=> 
     NULL 
     ["runAs"]=> 
     NULL 
     ["environment"]=> 
     NULL 
     ["runOnHost"]=> 
     NULL 
     ["output"]=> 
     NULL 
     ["dateFormat"]=> 
     string(11) "Y-m-d H:i:s" 
     ["enabled"]=> 
     string(1) "1" 
     ["haltDir"]=> 
     NULL 
     ["debug"]=> 
     string(1) "0" 
    } 
} 

log Dosyadan'ı:

Düzen
PHP Fatal error: Uncaught exception 'SuperClosure\Exception\ClosureUnserializationException' with message 'The closure did not unserialize to a SuperClosure.' in /home/.../public_html/vendor/jeremeamia/SuperClosure/src/Serializer.php:103 
Stack trace: 
#0 /home/.../public_html/vendor/hellogerard/jobby/src/BackgroundJob.php(233): SuperClosure\Serializer->unserialize('N;') 
#1 /home/.../public_html/vendor/hellogerard/jobby/src/BackgroundJob.php(88): Jobby\BackgroundJob->runFunction() 
#2 /home/.../public_html/vendor/hellogerard/jobby/bin/run-job(20): Jobby\BackgroundJob->run() 
#3 {main} 
thrown in /home/.../public_html/vendor/jeremeamia/SuperClosure/src/Serializer.php on line 103 

:

object(Closure)#9 (0) { 
} 

ve bunu çağırdığınızda mükemmel çalışıyor:

$serializer->unserialize($job['closure']); olduğunu

[email protected]:/home/.../public_html/public# /usr/local/bin/php cron.php 
I'm a function (2016-04-13 11:46:52)! 
bool(true) 
+0

$ serializer-> unserialize ($ job ['closure']); '? – magnetik

+0

@magnetik Düzenleme eklendi :) – simivar

cevap

1

ne oluyor olduğuna (kendinizi kapatılması unserializing kullanarak SuperClosure) kapanış için farklı bir bağlam yaratıyorsunuz, bu da tekrar serileştirmek için kullanılamaz. Uzun versiyon:

SuperClosure, Yansıma'yı kullanır; Geçtiğiniz Kapanış'ı kabul eder ve bu Kapanış'ın gerçekte oluşturulduğu php dosyasını belirler. Bu, orijinal kaynağını saklayarak çalışma zamanı Kapanışını serileştirilebilir kodlara dönüştürmenin tek yoludur.Eğer

  • Ancak (kaynak olarak eval fonksiyonu ile) kullanabilir hangi
  • Bu (çalışma zamanı içinde) yeni bir Closure'u oluşturur çalışma süresiyle tefrika dönüştürmek için eval() kullanılarak indirectly edilir $serializer->unserialize() arayarak

    • ,
    • SuperClosure bu kapatma kaynağını ihtiyacı (çalışmak itibaren) bu kapatma seri hale getirmekdauses SuperClosure jobby ve usesReflection
    • kod yerine gerçek kaynağını bulma kapatılması için kod bulmak için, gerçekten bu kodu
    çözümüne yönelik olarak

    içermiyor eval() bulur diye düşünüyorum yapılacak en iyi şey bu satırı kaldırmak olabilir:

    $job['closure'] = $serializer->unserialize($job['closure']); 
    

    ve doğrudan SuperClosure kabul etmeye jobby ikna; Böyle jobby güncellemeniz gerekebilir:

     protected function getExecutableCommand($job, array $config) 
        { 
    -  if (isset($config['closure'])) { 
    +  if (isset($config['closure']) && gettype($config['closure']) != 'string') { 
          $config['closure'] = $this->getSerializer()->serialize($config['closure']); 
         } 
    

    Ancak, ben hiç kullanmamış SuperClosure veya jobby ve gerçekten bu test edemez. Bu işe yararsa lütfen bize bildirin.