CronTab: Não está executando meus scripts PHP?

2

edição final: movi isso para Erro 406 com o trabalho GET Cron ?

EDIT 4:

Estou recebendo uma página de erro 406 com este cron!

aqui é o crontab (copiado do cPanel):

    * * * * * GET https://abc.com/cron/sendBulletinEmails.php >>
/home/abc/public_html/cron/logs/sendBulletinEmails.log

aqui está o log:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>406 Not Acceptable</title>
</head><body>
<h1>Not Acceptable</h1>
<p>An appropriate representation of the requested resource /cron/sendSurveyEmails.php could not be found on this server.</p>
<p>Additionally, a 404 Not Found
error was encountered while trying to use an ErrorDocument to handle the request.</p>
</body></html>

Eu tenho php configurado em uma máquina virtual rodando linux. Eu configurei meu crontab para:

* * * * * { cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails

no entanto, o cron não parece estar em execução. não está registrando nenhum erro e não está enviando e-mails. você sabe o que está errado?

obrigado!

EDIT 3:

Encontrei os logs do cron em execução. nada parece estar errado, mas ainda não está funcionando ou produzindo nada!

Aug  5 16:20:01 fiqsrv1 CRON[18543]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug  5 16:21:01 fiqsrv1 CRON[18549]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug  5 16:22:01 fiqsrv1 CRON[18554]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug  5 16:23:01 fiqsrv1 CRON[18559]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug  5 16:24:01 fiqsrv1 CRON[18564]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug  5 16:25:01 fiqsrv1 CRON[18569]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug  5 16:26:01 fiqsrv1 CRON[18574]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug  5 16:27:01 fiqsrv1 CRON[18595]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug  5 16:28:01 fiqsrv1 CRON[18601]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)
Aug  5 16:29:01 fiqsrv1 CRON[18610]: (cgurnik) CMD ({ cd /var/www/cron && /usr/bin/php -f sendQueuedEmails.php ;} |/usr/bin/logger -t sendQueuedEmails)

EDIT 2:

agora, quando eu executo o script, ele não gera nada.

Eu pensei em postar o script para mostrar que ele sempre gera algo, e é por isso que estou confuso quando o executo e nada sai (sem erros, sem saída)

    <?php
require '../includes/common.php';

/*
 * check that this cron job isn't already running (it can take a long time if there is a large email load, which it is meant for)
 * if it is running, end the script
 * if it is not running, continue
 * set the global variable for this cron job to on
 * get all queued emails that have their time to be sent in the past (and so they should be mailed out now)
 * loop through them, checking to see if the user is still set to receive the email, and if so, sending it to them
 * set the global variable for this cron job to off
 * 
 * JUST IN CASE: put the script in a try catch after the email cron is set to running in globalvars so that it is always reset, even upon failure
 */
// check that this cron job isn't already running (it can take a long time if there is a large email load, which it is meant for)
if(GlobalVars::isEmailCronRunning()) {
    echo "Already running! Aborted.";
    exit; // if it is running, end the script
}

// if it is not running, continue
// set the global variable for this cron job to on
GlobalVars::set(GlobalVars::VAR_IS_EMAIL_CRON_RUNNING, 1);

try {

    //  get all queued emails that have their time to be sent in the past (and so they should be mailed out now)
    $queuedEmails = Emails::getAllQueuedToSend();

    // loop through them, checking to see if the user is still set to receive the email, and if so, sending it to them
    $numEmailsSent = 0;
    $numEmailsRecalled = 0;
    foreach($queuedEmails as $email) {
        if(Emails::shouldBeSentToUser($email)) {
            Emails::sendQueuedEmail($email[Emails::id]);
            $numEmailsSent++;
        } else {
            Emails::update($email[Emails::id], array(Emails::result => Emails::RESULT_NOT_SENT) );
            $numEmailsRecalled++;
        }
    }

    // set the global variable for this cron job to off
    GlobalVars::set(GlobalVars::VAR_IS_EMAIL_CRON_RUNNING, 0);
} catch (Exception $e) {
    // set the global variable for this cron job to off
    GlobalVars::set(GlobalVars::VAR_IS_EMAIL_CRON_RUNNING, 0);
    echo "Error: " . print_r($e);
}

if($numEmailsSent || $numEmailsRecalled) {
    $details = "Sent " . $numEmailsSent . ". Recalled " . $numEmailsRecalled . ".";
    echo nl2br($details);
    ActionLogs::add(ActionLogs::CAT_CRON_JOBS, ActionLogs::TYPE_CRON_EMAILER_RUN, $details);
} else {
    echo "No emails were sent.";
}
?>

EDIT: eu tentei executá-lo e tenho o seguinte:

Warning: require_once(/includes/Swift-4.0.6/lib/swift_required.php): failed to open stream: No such file or directory in /var/www/includes/common.php on line 31

Fatal error: require_once(): Failed opening required '/includes/Swift-4.0.6/lib/swift_required.php' (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/includes/common.php on line 31

como posso definir o caminho de inclusão para que isso funcione tanto no meu servidor de depuração Linux como no meu servidor Linux ao vivo?

    
por Garrett 05.08.2010 / 15:38

9 respostas

2

Você pode usar a versão web no cron se o GET (lwp-request) ou curl estiver instalado no servidor

GET

* * * * * GET http://localhost/cron/sendQueuedEmails.php > /dev/null

curl

* * * * * curl -o /dev/null http://localhost/cron/sendQueuedEmails.php
    
por 05.08.2010 / 22:46
1

Preste atenção ao meu conselho gafanhoto! Estive aqui, feito isso. Faça isso da maneira mais fácil e use a versão cgi do php "/ usr / bin / php-cgi". Se você não tem, instale-o "apt-get install php5-cgi"

Não acredite em mim? Tente isso.

No diretório, crie um arquivo de texto chamado test.txt e adicione um texto aleatório dentro dele. Agora crie um novo diretório chamado test e um arquivo dentro dele chamado test.php e adicione este código:

<?php

include '../test.txt';

?>

Sua estrutura de diretórios deve ser algo assim:

/yourdirectory
/yourdirectory/test.txt
/yourdirectory/test/test.php

Mude para o diretório raiz "cd /" e execute isto a partir da linha de comando:

/ usr / bin / php -f /yourdirectory/test/test.php

e depois

/usr/bin/php-cgi-f/yourdirectory/test/test.php

Veja a diferença?

    
por 07.08.2010 / 13:46
0

Uma maneira mais simples de testar se uma linha pode ser executada com cron :

env -i bash -i /dev/null <actual command>
    
por 05.08.2010 / 15:59
0

Verifique / var / log / cron e veja se ele está sendo executado. Se for, tente sudo -u para ver se dá erros.

    
por 05.08.2010 / 16:36
0

Também - eu tentaria usar o caminho completo para o executável do PHP. Geralmente é '/ usr / bin / php', mas você pode emitir 'qual php' para verificar isso para o seu sistema.

Suas entradas seriam algo como isto:

          • cd / var / www / cron; / usr / bin / php - f sendBulletinEmails.php
          • cd / var / www / cron; / usr / bin / php -f sendSurveyEmails.php

Além disso, se você apenas alterar o diretório para que os arquivos estejam no diretório atual, você sempre poderá modificar o cron para:

          • /usr/bin/php -f /var/www/cron/sendBulletinEmails.php
          • /usr/bin/php-f/var/www/cron/sendSurveyEmails.php

Espero que isso ajude.

    
por 05.08.2010 / 18:41
0

Neste momento, esses scripts podem estar enviando sua saída para o bitbucket e você não saberá porque estão falhando. Seus cronjobs podem não estar configurados para enviar e-mail ou o e-mail no sistema pode não estar funcionando.

Eu não sou fã de enviar por e-mail a saída do cron, parcialmente porque as pessoas sempre acham que está tudo bem enviar spam para a saída 'root', e sou eu quem recebe esse e-mail. Como na maioria dos casos estamos falando de 1-2 linhas de saída, sugiro que você registre a saída de seus cronjobs para o syslog.

* * * * * { cd /var/www/cron && php -f sendBulletinEmails.php ;} |/usr/bin/logger -t sendBulletinEmails
* * * * * { cd /var/www/cron && php -f sendSurveyEmails.php ;} |/usr/bin/logger -t sendSurveyEmails
    
por 05.08.2010 / 19:13
0

Adicione a pasta que contém a pasta "includes" no seu caminho de inclusão. Para encontrá-lo use locate swift_required.php

    
por 05.08.2010 / 19:16
0

Com base na sua pergunta original, e no código que você postou, você está perdendo uma linha shebang que você precisa para executar seu script PHP desta forma. Tente alterar as primeiras linhas para isso:

#!/usr/local/bin/php5 -q
<?php

// your script here

?>

E você deveria ter sucesso.

Claro, substitua / usr / local / bin pelo caminho correto para sua instalação do PHP. Pode ou não ser o mesmo. Você só precisa dessa linha inicial para executá-la como uma tarefa do cron, não se estiver sendo executada a partir do navegador.

    
por 05.08.2010 / 20:11
0

Ei, como vai isso? Aqui estão duas soluções para o seu problema.

  1. Use caminhos completos para incluir arquivos em seus scripts. Precisa fazer isso para todos os includes. Se o arquivo de inclusão tiver outros includes, você precisará atualizá-los também.

include '../somefile.php' deve incluir '/somedir/somefile.php'

  1. Se o número 1 não funcionar ou você não quiser usar caminhos completos para includes, tente usar o php-cgi em vez da versão php cli.

Leia também esta seção do manual do php prestando muita atenção nas diferenças de cli e cgi.

link

A CLI SAPI não altera o diretório atual para o diretório do script executado!

Pontapé @ss!

    
por 06.08.2010 / 07:18

Tags