Symfony2:由于已经发送了标头,因此无法启动会话

时间:2012-10-29 17:58:07

标签: apache symfony nginx php

TL; DR 使用Nginx / PHP-FPM在Linux机器上获取错误,指出“由于已经发送了标头,因此无法启动会话。”。 Apache本地计算机设置上未发生错误

所以在我的本地机器上我运行Symfony2应用程序。没有错误弹出。但是当我部署到Linux服务器时,当我在Controller类中调用某个Action时,我收到此错误

Failed to start the session because headers have already been sent. 

在我已经调用的索引操作中

$session = $this->getRequest()->getSession();

在同一控制器类中的另一个动作中,我再次调用它。我尝试

时弹出错误
$session->set('foo', $bar);

在我的Twig中,我通过一个表单和一个带有形成属性的按钮调用该动作,如此

<form id='blahblah'>
    .... some fields here .....
    <button type='submit' formaction='{{path('2ndAction')}}'></a>
</form>

所以在我的本地机器上运行Apache一切运行正常。 Linux服务器正在使用Nginx和php-fpm,由于某种原因它崩溃了。我检查了phpInfo(),会话自动启动设置为关闭。不确定这是否是Nginx / php-fpm问题,但我认为这可能是相关信息。

这是Controller声明,indexAction()和我的2ndAction()

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;    
use CBSi\Utils\HTTPUtils\CURLUtil;

class StartController extends Controller
{
    /**
     * @var  CurlUtil $curlUtil
     */
    private $curlUtil;

    /**
     * @var AccessControl $accessControl
     */

    private $accessControl;

    /*placeholder for request object*/
    private $requestHolder;


   /**
    * @Route("/path/for/action/one", name="start")
    * @Template()
    */


public function indexAction()
{
 $session = $this->getRequest()->getSession();
 $this->curlUtil = $this->get('curlUtil');
 $this->requestHolder= Request::createFromGlobals();

// Some logic is done here


return $this->render('ListEngagementBundle:Start:start.html.twig');

}

/**
 * @Route("/path/to/second/action", name="2ndAction")
 * @Template
 */
public function 2ndAction(){
    $session = $this->getRequest()->getSession();
    $this-> curlUtil = $this->get('curlUtil');
    $this->requestHolder= Request::createFromGlobals();

    //Some logic is done here to get the data for the session variable

       $bar= logic output

               $session->set('foo', $bar);

    return $this->redirect($this->generateUrl('start'));
}
}

如果您需要我可以提供的更多信息,我会:)

4 个答案:

答案 0 :(得分:6)

所以我明白了。在我打电话的第二个动作

$session->getRequest()->getSession(); 

我必须将其更改为

$session = new Session();
$session->start();

去图。 :P

答案 1 :(得分:4)

我得到了同样的错误。但就我而言,我在 < ?php之前在AppKernel.php中放置了一些空格。 标签。因此,如果其他人收到此错误,请在每个.php文件的第一行之前检查是否有一些空格或制表符,该文件在会话初始化之前加载。

答案 2 :(得分:0)

每当我尝试使用symfony控制台更新数据库架构时以及当我尝试使用composer安装新的依赖项时,我收到此错误消息:

  

[RuntimeException]

Failed to start the session because headers have already been sent by "/var    
/www/html/pulsar283/src/MyService/Local/Brasil.php" at line 153.

所以,我去检查文件,然后在第152行找到了一个“?&gt;”(php关闭标签)。

所以,我只是删除了php close标签,错误再也没有显示出来了!

答案 3 :(得分:0)

当在某些预期<?php if( have_rows('series') ): while( have_rows('series') ): the_row(); ?> <div> <h3><?php the_sub_field('series_year'); ?></h3> <?php if( have_rows('series_year_details') ): ?> <ul> <?php while( have_rows('series_year_details') ): the_row(); ?> <li> <?php echo the_sub_field('event'); ?><br> <?php the_sub_field('date'); ?><br> <?php the_sub_field('view'); ?> </li> <?php endwhile; ?> </ul> <?php endif; ?> </div> <?php endwhile; endif; ?> 的脚本中有 echo 语句时,这会发生在我身上! 希望这可以帮助其他人调试问题