Falha de segmentação ao executar script PHP a partir da CLI, funciona bem como tarefa cron

1

Eu tenho um script PHP que lê um arquivo via fgetcsv através do zip:// do wrapper do PHP. Isso funciona bem localmente e quando executado na produção por meio de um cron job. Ele falha com uma falha de Segmentação quando invocado na produção via CLI, aparentemente ao final da leitura do arquivo quando fgetcsv retorna false .

As partes relevantes do script:

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

...

$i = 0;
while (($row = fgetcsv($file)) !== false) {

    // processing ...

    if (++$i % 50000 == 0) {
        echo '.';
    }
}

printf("\nFinished reading %s records.\n\n", number_format($i));
fclose($file);

E sua saída:

-bash-3.00$ ./script.php 
Reading file.zip................Segmentation fault

Parece que segfault antes do printf , mas depois de ter lido todos os registros, então eu suspeito que ele falha quando atinge o final do arquivo.

-bash-3.00$ /usr/local/bin/php5 -v
PHP 5.2.8 (cli) (built: Apr 14 2010 16:08:06) 
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
    with the ionCube PHP Loader v3.1.31, Copyright (c) 2002-2007, by ionCube Ltd.

Qual poderia ser a causa disso e existe uma maneira de corrigir isso?

    
por deceze 31.03.2011 / 03:39

3 respostas

2

strace o proc para descobrir onde está morrendo. Um segfault é, por definição, um erro não manipulado, portanto é improvável que os logs lhe digam muita coisa interessante. Especulação: php compilado em uma biblioteca compartilhada que não está disponível no host para o qual foi implementada.

Como alternativa, como você diz que está concorrendo em hospedagem compartilhada, por que não envolver o canal de suporte do fornecedor? Eles podem fazer muito mais com o acesso root para descobrir o que está acontecendo e o ambiente que estão fornecendo está quebrado.

    
por 31.03.2011 / 06:10
0

Você precisa verificar seus registros e ver onde estão ocorrendo erros no processo. Você pode precisar ativar o registro em seu arquivo php.ini.

Provavelmente você não tem permissões adequadas no arquivo. Quando você executa como cron você provavelmente está executando o script como root (supondo que você tenha o cron no crontab do sistema).

Portanto, verifique seus logs e verifique se o arquivo tem as permissões corretas a serem executadas como o usuário no qual você está efetuando login por meio da CLI.

    
por 31.03.2011 / 03:44
0

Eu tive o mesmo problema ao usar #!/usr/bin/php -q . Eu estava criando um pdf usando o fpdf.org. Eu estava lendo o arquivo inteiro (com 39.000 linhas) com o PHP file comando e eu estava recebendo o mesmo segfault. Eu substituí o comando file por fopen e fgets lendo linha por linha e o problema foi embora. Eu suspeito que este segfault veio do bash porque quando eu estava executando manualmente php -q mpdf.php em vez de ./mpdf com #!/usr/bin/php na primeira linha, o problema não ocorreu. A propósito, estou executando o PHP 4.3.1 no SUSE linux 8.2. Eu tenho que ficar lá e não passar para versões posteriores por várias razões.

Espero que tenha sido de alguma ajuda. Saudações da ensolarada Atenas (na Grécia)

Christos Michail

    
por 01.04.2016 / 16:59