Uma das vantagens de YeAPF ser orientado \u00e0 cria\u00e7\u00e3o de aplicativos chamados apenas por API \u00e9 a uniformiza\u00e7\u00e3o da chamada. Com isso estamos dizendo que todas as chamadas s\u00e3o feitas do mesmo jeito com o que o programador pode esquecer de como inventou a roda da \u00faltima vez, j\u00e1 que vai ser sempre do mesmo jeito. Ou, um grupo de programadores pode dividir suas tarefas e alternar responsabilidades que\u00a0as pe\u00e7as v\u00e3o acabar se encaixando.<\/p>\n
Pois bem, uma outra vantagem \u00e9 o processamento de tarefas de longa dura\u00e7\u00e3o. Na realidade \u00e9 um efeito colateral positivo mais do que uma vantagem propositalmente buscada.<\/p>\n
Entendemos por “tarefa de longa dura\u00e7\u00e3o”<\/strong>, aquele processo que n\u00e3o se encaixa nos 30-60 segundos que o PHP tem por padr\u00e3o para responder a uma requisi\u00e7\u00e3o de um cliente (seja este humano ou n\u00e3o).<\/p>\n Pense por exemplo, no que demora enviar um e-mail personalizado a cada cliente ou interessado do seu sistema on-line. Ou a gera\u00e7\u00e3o do arquivo de remessa de um lote de boletos para um banco. Nada disso cabe nos 30-60 segundos que voc\u00ea tem por padr\u00e3o e -mesmo que voc\u00ea tem a habilidade de\u00a0extorquir o PHP\u00a0para obter mais tempo- tamb\u00e9m n\u00e3o \u00e9 prudente\u00a0manter o usu\u00e1rio ocioso por mais do que 15 segundos. Ele com certeza vai clicar no bot\u00e3o de gerar remessa de novo para que “o processo v\u00e1 mais r\u00e1pido”.<\/p>\n \u00c9\u00a0aqui que entram as tarefas de longa dura\u00e7\u00e3o.<\/p>\n Tomemos o exemplo da gera\u00e7\u00e3o dos boletos banc\u00e1rios. Digamos que seu lote \u00e9 de 2500 boletos e cada boleto, al\u00e9m de ser gerado, ser\u00e1 enviado por e-mail para o cliente.<\/p>\n Um primeiro evento seria o que o cliente dispara ao escolher o escopo dos seus boletos: Por exemplo: Junho\/2015, Pato Branco\/PR. O programador faia uma invoca\u00e7\u00e3o mais ou menos assim:<\/p>\n Por outro lado, essa invoca\u00e7\u00e3o seria processada pelo PHP\u00a0em um script muito parecido com este:<\/p>\n Com isso nossa tarefa estaria criada. Repare que em lugar do evento “gerarRemessa” utilizei “gRemessa” mas apenas o fiz aos efeitos de que fique claro onde entra cada parte. Nada impede de utilizar “gerarRemessa” j\u00e1 que a tarefa vai entrar na fun\u00e7ao tboletos() e n\u00e3o na qboletos()<\/p>\n Agora vamos criar o la\u00e7o da tarefa em si mesma. A recomenda\u00e7\u00e3o \u00e9 colocar no mesmo PHP que temos a qboletos() para que fique todo junto. \u00a0O la\u00e7o ficaria mais ou menos assim supondo que sua tabela se chame “boletos”<\/p>\nycomm.invoke(\r\n \"boletos\",\r\n \"gerarRemessa\",\r\n { mes: \"06\/2015\", cidade: \"Pato Branco\", uf: \"PR\" },\r\n function(status, error, data) {\r\n }\r\n);<\/pre>\nfunction qboletos($a) {\r\n global $userContext, $sysDate, $u,\r\n $fieldValue, $fieldName,\r\n $userMsg, $xq_start;\r\n\r\n $useColNames = true;\r\n $countLimit=20;\r\n $ret='';\r\n\r\n extract(xq_extractValuesFromQuery());\r\n $xq_start=isset($xq_start)?intval($xq_start):0;\r\n\r\n switch($a)\r\n {\r\n case 'gerarRemessa':\r\n \/* instancio o gerente de tarefas do YeAPF *\/\r\n $tarefa=new YTaskManager();\r\n\r\n \/* monto os parametros que recebi do invoke *\/\r\n $params=array(\r\n 'mes'=>$mes,\r\n 'cidade'=>$cidade,\r\n 'uf'=>$uf\r\n );\r\n\r\n \/* transformo em json *\/\r\n $params=json_encode($params);\r\n\r\n \/* crio a tarefa com 340 segundos de vida m\u00e1xima por intera\u00e7\u00e3o do la\u00e7o *\/\r\n $tarefa->createNewTask(\"boletos\", \"gRemessa\", $params, 340);\r\n\r\n \/* fa\u00e7o qualquer outra coisa que a tarefa precise antes de come\u00e7ar a rodar ela *\/\r\n \/* ... *\/\r\n\r\n \/* habilito a tarefa *\/\r\n $tarefa->enableTask();\r\n\r\n break;\r\n }\r\n\r\n xq_produceReturnLines($ret, $useColNames, $countLimit);\r\n }\r\n}<\/pre>\n function tboletos($a)\r\n {\r\n global $sysDate, $ytasker, $xq_start;\r\n\r\n \/* publico o contexto operacional como se fossem vari\u00e1veis locais:\r\n xq_start, xq_target, j_params *\/\r\n extract($ytasker->getTaskContext());\r\n\r\n \/* garanto que xq_start seja um inteiro positivo *\/\r\n $xq_start=isset($xq_start)?intval($xq_start):0;\r\n\r\n switch($a)\r\n {\r\n case 'gRemessa':\r\n $sql=\"select * from boletos where data>='$dataInicial' and data<='$dataFinal' offset $xq_start\";\r\n $q=db_query($sql);\r\n \/* enquanto o sistema me deixe rodar a tarefa e tenha dados da tabela... *\/\r\n while (($ytasker->taskCanRun()) && ($d=db_fetch_array($q))) {\r\n \/* ... gero o boleto\r\n ... acrescento ele \u00e0 remessa\r\n ... envio e-mail *\/\r\n\r\n \/* incremento o 'ponteiro' para a tabela *\/\r\n $xq_start++;\r\n \/* indico \u00e0 tarefa o novo ponto de come\u00e7o caso caia\/finalize\/seja suspensa daqui at\u00e9 a volta do la\u00e7o *\/\r\n $ytasker->advanceTo($xq_start);\r\n }\r\n break;\r\n }\r\n }\r\n<\/pre>\n