O PHP em si não tem função de temporização. A funcionalidade de tarefas cronometradas do PHP deve ser implementada combinando com outras ferramentas. WordPress, por exemplo, tem a funcionalidade do wp-cron embutido e é impressionante. Neste artigo, vamos aprofundar as idéias de análise de várias tarefas de temporização PHP comuns.
O computador
PHP e seu ambiente
Esta informação foi capturada por experiência sem autorização.
Existe um CMD e um arquivo bat semelhantes no windows e no linux. O arquivo bat é semelhante a um arquivo shell. Executar este arquivo bat é o equivalente a executar os comandos dentro de um por um (e, é claro, a programação pode ser feita através da lógica). Então, Podemos usar o arquivo de comando bat para implementar uma tarefa de temporização PHP acima do servidor windows. Na verdade, cronometrar tarefas no windows é a mesma coisa no linux, exceto que os métodos e caminhos são diferentes. Vamos lá em baixo. Primeiro, crie um arquivo cron.bat em um local que você achar mais apropriado. Em seguida, abra-o com um editor de texto (o bloco de notas funcionará) e escreva algo como: D:\ PHP \php.exe-q D:\website\test.php significa que o uso do php.exe para executar o arquivo PHP test.php, como o contab acima, contorna o ambiente do servidor e é relativamente eficiente na execução. Depois de escrever, clique em salvar e feche o editor. O próximo passo é definir a tarefa programada para executar o cron.bat. Abra um por um: iniciar- > painel de controle- > agendamento de tarefas- > adicionar agendamento de tarefas. Na interface aberta, defina o tempo, a senha para a tarefa agendada. Ao selecionar, monte o cron.bat nele. Certo, então uma tarefa cronometrada é estabelecida. Clique com o botão direito sobre essa tarefa cronometrada, execute e a tarefa cronometrada começa a ser executada. No ponto, o processamento cron.bat é executado e o cron.bat vai executar o PHP.
Se o webmaster não tem seu próprio servidor e aluga hospedagem virtual, não pode acessar o sistema de servidor para realizar as operações acima. Como você deve executar uma tarefa de temporização PHP neste momento? Na verdade, há várias maneiras. Use ignore_user_abort(true) e o loop morto sleep para fazer uma linha diretamente no início de um documento PHP: ignore_user_abort(true); Neste ponto, quando este PHP é acessado via url, mesmo que o usuário desligue o navegador (desconexão), o PHP continua a ser executado no servidor. Usando esse recurso, podemos realizar a função muito vaca, ou seja, através dele para realizar a ativação da tarefa programada. Após a ativação, é apenas o que fazer sozinho. Na verdade, é um pouco semelhante à tarefa de fundo. Sleep (n), por sua vez, significa que quando a execução do programa chega aqui, não é executado para baixo por um tempo, mas em vez disso descansa por n segundos. Se você acessar este PHP, verá que a página deve carregar pelo menos n segundos. Na verdade, este comportamento de longa espera é relativamente consumitivo e não pode ser usado em grandes quantidades. Então, como exatamente as tarefas cronometradas podem ser implementadas? Isso pode ser feito usando o seguinte código: phpignore_user_abort(true); set_time_limit(0); date_default_timezone_set('PRC'); // mudar para a hora chinesa $run_time = strtotime('+1 dia'); // a primeira vez que a tarefa agendada é executada é amanhã a esta hora $interval = 3600*12; // executar if(! A cada 12 horas file_exists(dirname(__FILE__).'/cron-run')) exit(); // coloque um arquivo cron-run no diretório. Se este arquivo não existir, isso significa que já está no processo de execução. A tarefa não pode mais ser ativada. Faça uma segunda vez, caso contrário, o arquivo é acessado várias vezes, o servidor vai falhar do {if(! file_exists(dirname(__FILE__).'/cron-switch')) break; // se o arquivo cron-switch não existir, a execução é interrompida, é a ação de um switch $gmt_time = microtime(true); // tempo de execução atual, com precisão de 0, 0001 segundos $loop = isset($loop) && $loop? $loop : $run_time - $gmt_time; // o processamento aqui é para determinar quanto tempo você precisa esperar antes de começar a primeira execução da tarefa. $loop é o intervalo de tempo $loop = $loop > 0? $loop : 0; if(! $loop) break; // parar de dormir ($loop) se o intervalo do loop for zero; / /. // executando algum código //... @unlink(dirname(__FILE__).'/cron-run'); // aqui é para dizer ao programa, removendo o cron-run, que essa tarefa cronometrada já está em execução e não pode ser executada uma nova mesma tarefa $loop = $interval; } while(true); Executando este código PHP acima, a tarefa cronometrada é implementada. A tarefa não pára até que você exclua o arquivo cron-switch. No entanto, há um problema, ou seja, se o usuário acessar esse PHP diretamente, na verdade nada funciona, e a página também vai parar neste lugar, sempre carregando. Existe uma maneira de eliminar esse efeito? O fsockopen nos ajudou a resolver esse problema. O fsockopen pode ser implementado para continuar a executar o programa sem ter que obter o resultado de retorno ao solicitar acesso a um determinado arquivo. Este é um lugar diferente do uso usual do curl. Ao acessar uma página da web usando curl, devemos esperar até que o curl tenha carregado a página da web antes de executar o código após o curl, Embora, na verdade, curl também pode implementar o pedido "não-bloqueio", mas é mais complexo do que fsockopen, então nós preferimos fsockopen, fsockopen pode dentro do tempo prescrito, menos de 1 segundo, para completar a solicitação no caminho de acesso, após a conclusão não é este caminho se o conteúdo retorna, O seu mandato termina aqui e pode prosseguir com a execução do programa. Aproveitando esse recurso, incluímos o fsockopen no fluxo normal do programa. Fazendo uma solicitação para o endereço PHP desta tarefa cronometrada que criamos acima, a tarefa cronometrada será executada em segundo plano. Se o PHP url é www.yourdomain.com/script.php, então nós, na programação pode assim: / /. // execução normal do PHP //.. // remote request (not get content) função, o seguinte pode ser usado repetidamente //... // execução normal do PHP //.. // remote request (not get content) função, o seguinte pode ser usado repetidamente function _sock($url) {$host = parse_url($url,PHP_URL_HOST); $port = parse_url($url,PHP_URL_PORT); $port = $port ? $port : 80; $scheme = parse_url($url,PHP_URL_SCHEME); $path = parse_url($url,PHP_URL_PATH); $query = parse_url($url,PHP_URL_QUERY); if($query) $path .= '? '.$query; if($scheme == 'https') { $host = 'ssl://'.$host; } $fp = fsockopen($host,$port,$error_code,$error_msg,1); if(! $fp) { return array('error_code' => $error_code,'error_msg' => $error_msg); } else { stream_set_blocking($fp,true); // ative o modo não-bloqueador stream_set_timeout($fp,1), conforme descrito no manual; // definir o tempo limite $header = 'GET $path HTTP/1.1\r\n'; $header.='Host: $host\r\n'; $header.='Connection: close\r\n\r\n'; // conexões longas fecham fwrite($fp, $header); usleep(1000); // esta linha também é crítica. Sem esse lapso de tempo, provavelmente o fclose($fp) não poderia ser executado com sucesso no servidor nginx; return array('error_code' => 0); }}_sock('WWW. Domínio.com/ script.php.'); / /. // continuar com outras ações //.. Adicione este código a algum programa de resultados de envio de tarefa agendada. Depois de definir o tempo, envie e, em seguida, execute o código acima, você pode ativar a tarefa agendada. Além disso, não há nenhum sentimento de bloqueio na página para este usuário que está enviando.
Usar o comportamento dos utilizadores o acesso para executar algumas tarefas demora----------------------------------------------------------------------------------- mas utilizada acima dormir para automatizar tarefas, é uma solução ineficiente. Esperamos que não se utilize esta forma de execução, o que resolveria o problema da eficiência. Tomamos emprestado o comportamento de acesso do usuário para executar as tarefas. A visita do usuário ao site é realmente um comportamento muito rico, incluindo a visita de aranhas do motor de busca ao site, pode contar como este tipo. Quando o usuário visita o site, adicione uma ação interna para verificar se existe uma tarefa na lista de tarefas que não foi executada e, se houver, execute essa tarefa. Para os usuários, aproveitando o fsockopen dito acima, simplesmente não se sente que o seu acesso ainda contribui como tal. Mas a desvantagem desse tipo de acesso é que o acesso é muito irregular. Você quer executar uma determinada tarefa às 2 da manhã, mas esse período é muito infeliz. Nenhum usuário ou comportamento chega ao seu site e não há uma nova visita até as 6 da manhã. Daí que a tarefa que o senhor comissário pretendia realizar às duas horas só tenha sido executada às seis horas. Uma lista de tarefas programadas está envolvida aqui, o que significa que você precisa ter uma lista para manter um registro de quando e o que todas as tarefas são executadas. Em geral, muitos sistemas adotam bancos de dados para registrar essas listas de tarefas. Wordpress faz isso. Em resumo, se você quiser gerenciar várias tarefas cronometradas, não pode ser adequadamente layout com o único PHP acima. Você deve encontrar uma maneira de construir uma lista de horários. Como a lógica aqui é mais complexa, não vamos mais detalhá-la. Ficamos apenas no nível das idéias.
Usar 'crontab'trampolim de terceiros--------------------------------------------------------------------------------- é divertido, alguns operadores oferece vários tipos de ficheiro crontab, por exemplo uma nuvem ACE prevê separar crontab, Você pode preencher um uri no seu próprio aplicativo. O cloud BCE fornece a função de monitoramento do servidor. O uri fixo sob o aplicativo será acessado diariamente de acordo com uma certa regularidade de tempo. Existem muitas outras tarefas programadas que você pode usar em plataformas de terceiros semelhantes. Você pode usar essas tarefas de cronometragem de terceiros como um trampolim para as tarefas de cronometragem do seu site. Diz que você pode configurar uma tarefa cronometrada diária às 2am em um ACE de nuvem. A uri executada é /cron.php. Então você cria um cron.php, que leva o fsockopen para acessar o url do site onde você realmente está executando certas tarefas, como o WWW acima. Domínio.com/script.php. Além disso, vários urls podem ser acessados em cron.php. Em seguida, faça o upload do cron.php para o seu ACE. Deixe a tarefa cronometrada do ACE acessar /cron.php e, em seguida, deixe o cron.php solicitar remotamente o script da tarefa cronometrada do site de destino.
Incluo contém ficheiros de reciclagem (verificação)----------------------------------------------------------------------------------- características do processo de PHP para baixo torna o programa executável, usar esta funcionalidade, No momento em que usamos um determinado arquivo include é executado o arquivo que foi introduzido, sabendo que o programa dentro do arquivo include é executado e mais abaixo. O propósito da execução cronometrada pode ser alcançado se criarmos um loop, reutilizar sleep, incluir constantemente algum arquivo, de modo que o loop execute um segmento de programa. Vamos um pouco mais longe. Em vez de usar while(true) para implementar o loop, usamos o próprio arquivo incluído para se reincluir. Criamos um do.php com o seguinte conteúdo: se (...) exit(); // passar algum interruptor para desligar a execução //... // executando certos programas //... sleep($loop); // este $loop está incluído ('do.php.'); Atribuição prévia de include(dirname(__FILE__).'/ do.php.'); Na verdade, através deste método de execução e enquanto o pensamento também é como. E o mesmo uso de sono, ineficiente. PHP tarefas de cronometragem é uma coisa muito interessante. Embora, para ser honesto, é mais eficiente ir para a execução direta de arquivos PHP com o sistema php.exe, mas para muitos webmasters comuns, um host virtual não pode fazer a execução direta de programas nativos PHP.