Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 会话_start()在特定脚本上以静默方式失败_Php_Session - Fatal编程技术网

Php 会话_start()在特定脚本上以静默方式失败

Php 会话_start()在特定脚本上以静默方式失败,php,session,Php,Session,用最简单的代码 <?php $ok = session_start(); echo var_dump($ok); ?> 启动会话失败,$ok为false,并且未创建会话cookie。同样,使用session_name('xxx')命名会话无效。如果在另一个脚本中设置,$\u SESSION变量也不会保留值 同一服务器上使用会话功能的其他旧脚本也能正常工作。同样的脚本在本地主机上运行时也可以正常工作 我在错误分析期间执行的步骤,其中: 为了得到上面的脚本,我删除了

用最简单的代码

<?php
    $ok = session_start();
    echo var_dump($ok);
?>

启动会话失败,
$ok
为false,并且未创建会话cookie。同样,使用
session_name('xxx')命名会话无效。如果在另一个脚本中设置,
$\u SESSION
变量也不会保留值

同一服务器上使用会话功能的其他旧脚本也能正常工作。同样的脚本在本地主机上运行时也可以正常工作

我在错误分析期间执行的步骤,其中:

  • 为了得到上面的脚本,我删除了命名会话和其他所有内容(最简单的示例会重现错误)
  • 我检查了提供商提供的错误日志,但没有找到任何条目
  • 我确保没有额外的空白,所有脚本都立即以
    session\u start()
    开始
  • 在同一个脚本中,我显示了
    phpinfo()
    来标记:
  • 会话支持:已启用
  • session.auto\u启动:关闭
  • session.use\u cookies:1
  • session.use\u only\u cookies:1
    (有争议,但因为其他脚本可以工作…)
  • 我开始怀疑我的理智
  • 我记得以前在文本文件中遇到过以字节顺序标记形式出现的“不可见字符”,我想可能是编码之类的问题(见下面的答案)

  • 可能导致这些症状的错误的其他来源是什么?

    问题是,脚本文件被编码为Windows下Notepad++调用的
    UTF-8 BOM

    在Notepad++中将其转换为straight
    UTF-8
    ,然后重新加载脚本,立即修复了所有问题

    所以我猜文件中的某个地方留下了一个错误的字节顺序标记,导致服务器上的php安装无法识别或无法解析脚本文件


    编辑:mario在

    @mario Good question:-)上更详细地描述了相同的根本原因,您建议这种错误的级别是什么?这是一个E_警告,但仍应使用
    E_ALL
    (以防它是由以前的通知引起/影响的,例如)。尝试使用失败的脚本,通过放置
    错误报告(E_ALL)
    在开始时,它似乎没有对日志文件中的消息执行任何操作。也许它也不能正确执行,或者这是服务器配置(外部主机)的问题。日志设置、
    display\u errors
    set\u error\u handler
    display\u errors
    确实关闭了,但我无法更改php.ini(外部主机)。使用
    error\u reporting()
    调用一个自定义日志函数,我可以得到
    无法启动会话的消息,当消息头已经发送时
    ,它至少应该在会话启动之前给出一个提示,表明有什么事情发生了。说得好!作为一名php新手,我学到了一些东西:-)@mario是的,这似乎与您(相当令人印象深刻)的文章中列出的根本原因相同。我将在下面的答案中添加一个链接。不过,我还是让它站起来吧,因为在典型的搜索词中,我找不到那个问题。无论如何,我都不想欺骗你关闭你的问题。虽然它只涵盖了一个(有点狭隘的)原因,但演示显然弥补了这一点。虽然如果答案再次更详细地涵盖调查步骤(php.ini检查、wget-S标题、错误报告、最终的BOM发现和修复)可能会更有用。没错,我尝试在问题中包含不起作用的步骤,并在现在的编辑中对此进行了改进。