Você devia me seguir no twitter, clique aqui.

Filed under: php

Keep-Alive: Fazendo flush antes do término da execução, no controller do Symfony 2

No Symfony (1 e 2), a saída do controlador apenas é enviada após o processamento interno.

Para uma saída constante, em processos demorados, precisamos outra abordagem,

chamando o flush manualmente e seguindo o caminho Keep-Alive.

A necessidade

A CamelSpiderBundle possui um controller que executa a CamelSpider e isto pode demorar um pouco.

É necessário que exista uma saída informativa e uma negociação com o navegador para que não seja interrompida a exibição.

Solução: 

//....

    public function captureAction($id)
    {
        $response = new Response();
        $response->headers->set('Content-Encoding', 'chunked');
        $response->headers->set('Transfer-Encoding', 'chunked');
        $response->headers->set('Content-Type', 'text/html');
        $response->headers->set('Connection', 'keep-alive');
        $response->sendHeaders();
        flush();
        ob_flush();
        echo "<html><head><title>Capture</title></head><body><pre>"; 
        $this->get('camel_spider.launcher')->checkUpdates($id);
         echo "\n\n\n\n<b>Done</b>.";
        echo "</pre></body></html>";
        return $response;
    }
//.....
Você pode visualizar o arquivo completo aqui
Algumas informações relevantes:

Read the rest of this post »

Customizando as páginas de erro no Symfony 2

Existem várias formas de customizar as páginas de erro no Symfony 2,

mas uma maneira bem simples,

é sobrecarregar a view de erros da Twig,

criando o arquivo app/Resources/TwigBundle/views/Exception/error.html.twig:

 

Lógico que esta sobrecarga de exibição é feita apenas no ambiente de produção,

e para testar suas alterações você precisa limpar o cache.

./app/console cache:clear --env=prod

 

 

Como acessar as informações do Usuário, no Controller Symfony 2

Se você implementou o login conforme a documentação,
pode utilizar a seguinte forma:

<?php

namespace Acme\DemoBundle\Controller;

class DemoController extends Controller
{
    public function indexAction()
    {
            //seu objeto Token, definido no Provider:
            $this->get('security.context')->getToken();

            //seu objeto Identity, definido no Provider                        
            $this->get('security.context')->getToken()->getUser();     

            //seu método implementado no objeto Identity
            $this->get('security.context')->getToken()->getUser()->getLastName();   

//....

PHP 5.3 ?: ternary operator e o Twitto

Pense comigo em um exemplo simples,
onde você testa x e define valor padrão caso x não atenda ao
requisito mínimo.

Tradicionalmente escreveríamos algo assim:
  
> php > $x = 1; if( $x < 2 ){ $x = 3; }; var_dump($x);
> int(3)

Agora a escrita reduzida, adicionada no PHP 5.3:

> php > $x = 1; $x > 1 ?: $x = 3; var_dump($x);
> int(3)
> php > $x = 2; $x > 1 ?: $x =  3; var_dump($x);
> int(2)

A escrita reduzida permitiu a escrita de um framework em um tweet,
o Twitto - A web framework in a tweet:

require __DIR__.'/c.php'; if (!is_callable($c = @$_GET['c'] ?: function() { echo 'Woah!'; }
)) throw new Exception('Error'); $c();


Onde mais você vê o uso de :? ?

Dicas do Google para performance PHP

Dt-improved-performance

Para leitura, algumas dicas do Google, para melhorar a performance nos gargalos:

http://code.google.com/intl/pt-BR/speed/articles/optimizing-php.html

Destaque na simplicidade do tópico "Avoid doing SQL queries within a loop".

Apesar de ser uma página antiga, é bom todos terem isso em mente, apesar de que,
em algumas vezes (raras) é necessário resolver o conflito "Orientação à performance" VERSUS "Orientação à objeto".


Poucos usam?! Operadores Bit-a-bit no PHP - Que tal estudar um pouquinho do básico?

Programmer

Ao menos nos códigos PHP que eu tenho visto ultimamente ( talvez eu esteja no lado errado da internet),
vejo que os programadores PHP pouco utilizam  os operadores Bit-a-bit e acabam gerendo códigos desnecessários.

Quem nunca viu métodos para saber se um número era par ou ímpar?
Geralmente uma divisão por 2 e analisando o resultado, se é inteiro e etc...


Vamos testar operadores Bit-a-bit num exemplo simples,  descobrir se é impar ou par:

<?php
var_dump(44 & 1);
var_dump(45 & 1);

Que tal estudar um pouquinho do básico?

Leia o sobre  Operadores Bit-a-bit  e poste exemplos aqui nos comentários!

Symfony Doctrine Migrations

Fig02

 

Você já colocou seu site para rodar na produção,
mas precisou modificar a estrutura do banco de dados.

E se estas alterações devem ser executadas em 10 sites que utilizam o mesmo aplicativo?

Executar o sql manualmente em cada website?

Não.
Migrations!

A cada alteração no schema, no ambiente DEV:

./symfony doc:generate-migrations-diff
./symfony doctrine:build --all-classes --and-migrate
Quando você finalmente enviar para produção, execute no ambiente Prod:
./symfony doc:migrate --env="prod"

Você pode utilizar também a opção --dry-run

Referências: