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'));
}
}
私が提供できるより多くの情報が必要な場合は私がします:)