我有一个自定义CMS系统工作,使用段落作为构建块,使用Ajax(prototypejs)调用和功能,以给定的顺序解析HTML块,清理它们并将该数据保存在会话变量中的关联数组中.
用户登录,会话被创建,我可以检查这个会话没有问题在我需要的每一个页面.该系统直接在确定的网站上工作,所以用户可以实时查看他的更新,并按普通用户浏览网站,但可以编辑.
所以,没有什么新的.但这是奇怪的事情.
Enduser站点在编辑模式(admin用户登录):路径“/”
在记录状态被验证之后,一个函数处理可编辑的内容并将关联数组保存到会话中,它还启动一些javascript对象来编辑每个段落.数据实际上被保存,我可以使用一个外部脚本来检查这个PHP脚本是否结束.如果我加载一个新的页面(新的内容),会话被更新为新的数据)
管理员用户使用Inplaceeditor修改段落,此HTML块通过Ajax发送到启动命名会话的PHP脚本,读取当前会话数据,检查是否应修改,附加或删除段落,并将值重新分配给现有的数组键在$_SESSION.如果我在分配新数据之后将var_dump()o print_r设置为$_SESSION.之后,脚本将回显处理后的html,并且ajax更新调用页面上的原始段落.
此脚本位于/admin/cms/…etc中,表示站点根目录中至少有4个目录.
当脚本结束时,我检查使用相同的会话转储脚本来查看数据是否真的写/提交,但是$_SESSION只有来自调用页面的原始数据.
相同的ID,相同的会话名称,相同的session_start(),但没有数据被写入.
这个整个操作非常快,所以尽管这可能是一个速度问题,但脚本在session_write_close可以使他的工作结束之前结束.
但是,如果我在$_SESSION数组中添加一个新的键,并在其中放置一些数据,则数据将被更新和写入.如果我不输出这个脚本的东西,只是处理数据和设置会话变量,它也得到更新和写入.
它像$_SESSION数组的一些成员被阻止更新.
我做了什么跟踪这个错误,我确信我没有做错.
> 1.- register_globals当然是
> 2.- session_name()和session_start()始终存在于给定中
订购.我以前有多个
session_start() – 在同一页面上关闭
使用几个命名的会话,但是
改进这个不再是这个问题
所以.
> 3.-会话数据处理后,我使用session_write_close().也
尝试没有,让PHP决定
何时提交数据,但没有运气.
> 4.-我只使用cookies的SID.
> 5.-会话存储在/ tmp中,我可以看到更新的数据.
>我也试过使用自定义保存
处理程序在DB上,但同样的问题,
“_write”只有当没有输出作为存在时才调用.
>我搜索PHP.net,stackoverflow,谷歌等为此主题.我从来没有经过调查就问过,这是我多年来的第一次,但它只是这么非常的不可思议的,
最奇怪的是,当我只是处理数据而不输出$_SESSION得到更新好的.但是,如果我以后通过添加输出来修改这个脚本,再试一次,而不是仅仅提供新的(最后)值,我会得到原来的值,首先由调用页面创建的值,有时候在几个倍! PHP不能在脚本之间缓存值,还是没有globlals.
我真的很无知这个系统在PHP4.3上完美无瑕,因为我使用5.3.3的两个飞蛾,我的用户在哪里弄平头的数据,所以我检查了,是的,有严重的问题.今天我更新到(5.3.6),我不能得到这个会话值被提交.
<? session_cache_limiter('nocache'); session_name("CMS_ses"); session_start(); include('../htmLawed/htmLawed.PHP'); include("utils_cms.PHP"); include("../../../PHP/utils_array.PHP"); $value=$_POST['value']; $editorId=$_POST['editorId']; $clase=$_POST['clase']; $editorId=str_replace("pre","",$editorId); $value=html_entity_decode(stripslashes($value),ENT_QUOTES); if (strlen(trim($value))==0) { die(); } $value="<div id=\"$editorId\" class=\"$clase\">$value</div>"; $newXHTML=$value; $retorno=CMS_nuevoBloque($newXHTML,$editorId); $_SESSION['data']['CMSeditores']=$retorno[1]; $_SESSION['data']['CMScont']=$retorno[2]; session_write_close(); print_r($retorno[0]); //Offending part...without everything works ?>
真的没什么奇怪的这里….主页代码更简单,没有奇怪的PHP指令等
include 'PHP/db.PHP'; $len=$_GET['len']; $sec=$_GET['sec']; $cont=$_GET['cont']; $admfin=$_GET['admfin']; $fecha=$_GET['fecha']; $token=$_GET['token']; $cur=$_GET['cur']; $PHP_SELF=$_SERVER['PHP_SELF']; session_cache_limiter('nocache'); session_name("CMS_ses"); session_start(); $passvar=''; unset($adm); if ((!empty($_SESSION['cms_logged'])) and (!isset($admfin)) ) { $nivelpermisos=$_SESSION['cms_logged_group']; $useractual=$_SESSION['cms_logged']; $adm=1; } elseif (empty($_SESSION['cms_logged'])) { unset($useractual); } //.........rest of the code
更新:我做了深夜测试,发现有些我不明白.请问:
它不仅与Sessions有关,还与MysqL Querys有关.相同的代码,而不是尝试写入$_SESSION数组,我使用session_id对Innodb表进行了简单的更新.当我输出一些代码,更新确实执行,(我可以输出查询字符串,没有MysqL_error()或通知)问题,但检查数据库该行没有更新.如果脚本和Query得到提交,输出.只有常见的事情是会话开始并输出.
我重新启动了Apache等(谁知道),但没有运气.然后我做了一些非常愚蠢的事情,因为这是一个服务器端的事情.我将浏览器更改为Firefox(使用safari),一切正常!好的,重新检查,回到野生动物园,没有任何作用.两者并肩运行,同样的问题. PHP是服务器端,不同浏览器如何处理代码不同,浏览器可以对apache回滚,请求没有处理或者调用相同的脚本两次,而不通知(检查safaris开发者控制台,脚本只调用一次)?可以safari重新提交数据,因为它“认为”ajax失败?我使用firebug和Safaris开发工具检查标题,没有什么奇怪的,但是当我用safari进行Ajax调用时,调用者页面重新加载数据(Aka conection to server …).
我真的不明白什么