7

TL; DR Nginx / PHP-FPMを使用するLinuxボックスで、「ヘッダーが既に送信されているため、セッションの開始に失敗しました。」というエラーが発生します。Apacheローカルマシンのセットアップでエラーが発生していません

そのため、ローカルマシンでは、Symfony2アプリが正常に実行されています。エラーは表示されません。しかし、Linuxサーバーにデプロイするとすぐに、Controllerクラス内で特定のアクションを呼び出すとこのエラーが発生します

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

インデックスアクションで私はすでに呼び出しました

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

そして、同じコントローラークラス内の別のアクションで、私はそれを再び呼び出しています。試してみるとエラーが表示されます

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

私のTwigでは、フォームとそのようなformactionプロパティを持つボタンによってアクションを呼び出しています。

<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

4 に答える 4

8

だから私はそれを理解しました。私が呼んでいた2番目のアクションで

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

私はそれをに変更しなければなりませんでした

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

図に行きます。:P

于 2012-10-29T19:01:49.637 に答える
6

同じエラーが発生しました。しかし、私の場合、 < ?php タグの前に AppKernel.php にいくつかのスペースを配置しました。したがって、他の誰かがこのエラーを受け取った場合は、セッションが初期化される前にロードされる各 .php ファイルの最初の行の前にスペースまたはタブがあるかどうかを確認してください。

于 2013-01-04T10:49:08.753 に答える