最近、Web サイトでアンケートを行っていたときに、ThinkPHP の Cookie とセッションの間で競合が発生し、その結果 Cookie が使用できなくなりました。
このウェブサイトは ThinkPHP フレームワークを使用して作成されており、多くの写真を表示するページがあり、各写真には対応する投票が必要です。IP アドレスを制限することで、訪問者が一定の時間範囲内で複数の写真に投票することが制限されます。ただし、最初はこの問題を解決するために IP がデータベースに保存されていましたが、生成されたセッション ID はサービス ファイル内にある必要があります。 ThinkPHP マニュアルの指示に従ってセッションを操作すると、すべてがスムーズに進みました。しかし、Cookie を生成した後、ローカル コンピューターで Cookie テキストが見つかりませんでした。 Cookie の生成を確認しましたが、表示およびテストの結果、制限がないことがわかったので、Cookie の生成をテストするために別の php ファイルを作成しました。問題ありません。Cookie テキストはローカルで見つかったので、次のコンテンツをオンラインで見つけました。問題は順番に解決され、setcookie() 関数を使用して Cookie が設定され、望ましい結果が得られました。
解決策は次のとおりです:
php.ini設定ファイルを見つけて、output_bufferingという項目を探し、その値をoffからonに変更し、Apacheを再起動すれば問題ありません。
似たような問題はたくさんあります:
ローカルでは元々問題なく実行されていたファイルが、サーバーでテストすると、実際にはローカルでは表示されなかったエラーが表示されることがあります: 警告: ヘッダー情報は変更できません - ヘッダーはすでに によって送信されています。 ..
このような記述は、明らかに setcookie が原因であると考えられますが、インターネットで調べてみると、次のような説明があります: Cookie 自体には、次のような使用制限があります:
1. 呼び出しの記述。 setcookie はタグの前に配置する必要があります
2. setcookie を呼び出す前に、echo は使用できません
3. Web ページがリロードされるまで、Cookie はプログラムに表示されません
4. setcookie 関数は、データが出力される前に送信する必要がありますブラウザ
上記の制限に基づいて、setcookie() 関数を実行すると、「インデックスが未定義」、「ヘッダー情報を変更できません - ヘッダーはすでに送信されています」などの問題が発生することがよくあります。ヘッダー情報の変更 - すでに送信されているヘッダー」 この方法は、Cookie を生成する前にブラウザへのデータの出力を遅らせることです。そのため、プログラムの先頭に ob_start() 関数を追加できます。このようにして問題は解決できます。 ただし、ob_start() を追加したい場合は、プログラムが作成されているため、これを変更するのは少し憂鬱です。このエラーが発生したことを知ったとき、なぜローカル コンピューターでこの問題が発生しなかったのか疑問に思いました。PHP.ini の設定が異なるためだと思いましたが、よく考えてみると、それは間違いでした。すべて同じです。そこで、その後に続く「output starting at...」という文に注目すると、setcookie の前に別の場所に出力があったことを意味し、output starting at に続くファイルを見つけ、最終的に最初の行が空白であることがわかりました。
ThinkPHP での Cookie とセッションの競合により Cookie が使用できなくなる問題の解決策に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。