我在努力来实现某种缓存在PHP script,将走出去,许多不同的客户/网站,其中将以通过部署相当非技术用户,利用各种网主机。由于非技术性质的用户,我想尽量避免要求它们调整文件的权限。缓存需要跨越的会议,因此,使用会议变量。如果我被编码这ASP我会使用的应用程序的变量,但他们不存在PHP(据我所知)

没有任何人有任何建议,关于如何完成这个吗?

这里有一些可能性,我认为,任何意见,在这些会是有用的:

  • 缓存通过文件系统的临时文件夹-我可以用sys_get_temp_dir()(或者一些家庭卷类似的功能。PHP4),以帮助找到这样的一个文件夹。缺点在这里,它很可能不起作用的主机上使用的限制openbase_dir
  • 我看了一些网站在提到欺骗PHP成使所有的用户会议分享同一届会议的状态,从而迫使会议可变行会议的变量。当然我不能找到这后,现在...这似乎是可怕的。(我会更新这个问题带有链接到这个职位一旦我再次找到它)
  • 使用第三方数据存储像亚马逊的简单的存储服务似乎是大材小用
  • 缓存服务器上的数据,我控制,并具有客户下载的新数据有关的每一个打击。

再次,任何评论这些想法或任何新的,将不胜感激。

更新: 我试图使用session_id()使用共用会议的国家,但是它不工作。每届会议保持其自己的"GlobalCache",任何想法为什么?:

// This code doesn't work, but the similar code in my answer does!

function test() {
    if (!$_SESSION['session_count']) $_SESSION['session_count'] = 0;
    $_SESSION['session_count']++;


    $count = get_cache( 'count' );

    print "pre application count: $count<br>";

    if ( !$count )
        $count = 0;

    $count++;

    print "session_id: " . session_id() . "<br>";
    print "post application count: $count<br>";
    print "session_count: " . $_SESSION['session_count'] . "<br>";

    set_cache('count', $count);
}


function set_cache( $name, $value ) {
    $old_session = session_id();
    print "old_session (set): $old_session<br>";

    session_id("GlobalCache");
    print "new_session (set): " . session_id() .  "<br>";

    $_SESSION[$name] = $value;
    session_id( $old_session );
}

function get_cache( $name ) {
    $old_session = session_id();
    print "old_session (get): $old_session<br>";

    session_id("GlobalCache");
    print "new_session (get): " . session_id() .  "<br>";

    $value = $_SESSION[$name];
    session_id( $old_session );
    return $value;
}

session_start();
test();

更新: 有人建议使用缓存,这实际上是一个伟大的解决方案,一些,但由于我不能控制的终端服务器环境,这不是一个选项。这个想法是要有一个脚本,人们可以只是FTP到一个共用的托管帐户,只是工作。

更新: 有人建议创建自己的高速缓存文件夹脚本,但是我不需要建立这样一个文件夹内有文件夹已经写入权限?

更新方案: 我最终找出的问题在我的全球会议脚本和张贴我自己的答案。谢谢你的帮助每一个人。

有帮助吗?

解决方案

好吧,我想通了,如何做到这一点可以通过模拟ASP式应用程序变量使用共享/全球会议的状态。两个关键的变化是从我的非工作中的代码相关的更新:

  1. 关会议的国家,我们必须结束本届会议上,切换到新的一项,然后开始。我已经封装在这个过程中switch_session()

  2. 因为我们交换届会议id周围我们必须缓冲页的输出,使用ob_start()/ob_end_flush()因此,本届会议cookie不发太快了。

全工作的代码如下(清理也是!)。这个可以容易地通过测试载入页面,在一个即和有Firefox窗口,并重新装载的每一个几次收看计数器上升:

<?php
function test() {

    // Do a regular session count
    print "session_id: " . session_id() . "<br>";
    if (!$_SESSION['session_count']) $_SESSION['session_count'] = 0;
    $_SESSION['session_count']++;
    print "session count: " . $_SESSION['session_count'] . "<br>";


    // Do an application count
    $count = get_cache( 'count' );
    if ( !$count ) $count = 0;
    $count++;
    print "application count: $count<br>";
    set_cache('count', $count);
}


function set_cache( $name, $value ) {
    $old_session = switch_session("GlobalCache");
    $_SESSION[$name] = $value;
    switch_session( $old_session );
}

function get_cache( $name ) {
    $old_session = switch_session("GlobalCache");
    $value = $_SESSION[$name];
    switch_session( $old_session );
    return $value;
}

function switch_session( $session_id ) {

    // switch the session and return the original
    $old_id = session_id();

    session_write_close();
    session_id($session_id);
    session_start();
    return $old_id;
}

ob_start();
session_start();
test();
ob_end_flush();
?>

其他提示

你可以使用的会议有一个固定会议的关键。

http://de.php.net/manual/en/function.session-id.php:

session_id([id])是用来获取或设定的会议 id 对于当前会议。如果id是指定的,它将取代目前的session id.session_id()需要将所谓的前session_start()用于这一目的。

使用自己的高速缓存dir在应用程序的目录。与其一起你不必斗争的各种服务和/或PHP设置和更好的便携性。

我投票"缓存服务器上的数据,我控制,并具有客户下载新的数据来自有关每一击。"

所有其他的路径导致某些疯狂。

检查了缓存php-这工作真的很好。

http://www.php.net/memcache

我使用了更新的功能,由作者作为一种方式,以缓一个简单的数据库查询结果,因为我期待的高负荷。我还保存时间戳这样我就可以定义如何经常的页面更新数据库的结果,而不是只把缓存的价值。

我可以告诉你,这个缓冲功能有更多,更糟糕的性能比直接的数据库,在每个请求。实际上我杀死了服务器。一旦我切换回到简单地查询该数据库服务器有达到全速和相当大的负荷甚至没注意到。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top