小编Ken*_*ins的帖子

PHP函数的Big-O列表

在使用PHP一段时间后,我注意到并非所有PHP内置函数都如预期的那样快.考虑下面两个可能的函数实现,它使用缓存的素数数组来查找数字是否为素数.

//very slow for large $prime_array
$prime_array = array( 2, 3, 5, 7, 11, 13, .... 104729, ... );
$result_array = array();
foreach( $prime_array => $number ) {
    $result_array[$number] = in_array( $number, $large_prime_array );
}

//speed is much less dependent on size of $prime_array, and runs much faster.
$prime_array => array( 2 => NULL, 3 => NULL, 5 => NULL, 7 => NULL,
                       11 => NULL, 13 => NULL, .... 104729 => NULL, ... );
foreach( $prime_array => $number ) …
Run Code Online (Sandbox Code Playgroud)

php arrays algorithm performance big-o

332
推荐指数
3
解决办法
7万
查看次数

匿名递归PHP函数

是否可以使用递归和匿名的PHP函数?这是我试图让它工作,但它没有传递函数名称.

$factorial = function( $n ) use ( $factorial ) {
    if( $n <= 1 ) return 1;
    return $factorial( $n - 1 ) * $n;
};
print $factorial( 5 );
Run Code Online (Sandbox Code Playgroud)

我也知道这是实现阶乘的一种不好的方法,它只是一个例子.

php recursion lambda closures anonymous-function

190
推荐指数
3
解决办法
3万
查看次数

直接调用分配给对象属性的闭包

我希望能够直接调用我分配给对象属性的闭包,而无需将闭包重新分配给变量然后调用它.这可能吗?

下面的代码不起作用和原因Fatal error: Call to undefined method stdClass::callback().

$obj = new stdClass();
$obj->callback = function() {
    print "HelloWorld!";
};
$obj->callback();
Run Code Online (Sandbox Code Playgroud)

php closures properties object

100
推荐指数
7
解决办法
3万
查看次数

如何在C级上实现PHP数组?

PHP array是PHP的核心功能之一.它是稀疏的,允许同一数组中的多类型键,并支持集合,字典,数组,堆栈/队列和迭代功能.

但是在使用PHP一段时间之后,我发现很多array_*功能都比你初看起来慢得多.就像在array_rand一个非常大的阵列(10000+)的情况下.array_rand实际上是这么慢,在你使用php数组作为索引数组的情况下,像rand( 0, array_length( $array ) - 1 )运行MUCH 的函数要快array_rand.

现在我的问题.

如何在C级上实现PHP数组?这对于预测大量使用PHP数组数据类型的不同功能的函数的Big O非常有用.

php arrays

46
推荐指数
3
解决办法
8984
查看次数

在树枝中测试变量相等

twig中,是否有一种简单的方法来测试2个变量的相等性?

{% if var1 = var2 %}无效,{% if var1 is sameas(var2) %}只有两者都是字符串才有效...

(来自docs)"sameas检查变量是否指向与另一个变量相同的内存地址",就像那些有用.

所以我发现比较整数的唯一方法是将它们都转换为字符串:
{% if var1|lower is sameas(var2|lower) %}

php templates twig

40
推荐指数
1
解决办法
6万
查看次数

什么时候(如果有的话)是eval而不是邪恶?

我听说很多 地方 PHP的eval功能往往不是答案.鉴于PHP 5.3的LSB闭包,我们已经没有理由依赖evalcreate_function.

是否有任何可以想象的案例,哪些eval是PHP 5.3中最好(唯一?)的答案?

这个问题不是关于eval一般是否是邪恶,因为它显然不是.

答案摘要:

  • 评估数值表达式(或PHP的其他"安全"子集)
  • 单元测试
  • 交互式PHP"shell"
  • 可信赖的反序列化 var_export
  • 一些模板语言
  • 为管理员和/或黑客创建后门
  • 与<PHP 5.3的兼容性
  • 检查语法(可能不安全)

php eval

26
推荐指数
4
解决办法
7218
查看次数

需要一个任意PHP文件而不将变量泄漏到范围内

是否有可能在PHP中require任意文件,而从目前的范围泄露任何变量到所需文件的变量命名空间或污染全局变量的范围是什么?

我想用PHP文件进行轻量级模板化,并且如果有可能加载模板文件而没有任何变量在其范围内而且是预期的模板文件,那就是为了纯度而感到疑惑.

我已经设置了一个我希望通过解决方案的测试.应该要求RequiredFile.php并让它返回Success, no leaking variables..

RequiredFile.php:

<?php

print array() === get_defined_vars()
    ? "Success, no leaking variables."
    : "Failed, leaked variables: ".implode(", ",array_keys(get_defined_vars()));

?>
Run Code Online (Sandbox Code Playgroud)

我得到的最接近的是使用一个闭包,但它仍然会返回Failed, leaked variables: _file.

$scope = function( $_file, array $scope_variables ) {
    extract( $scope_variables ); unset( $scope_variables );
    //No way to prevent $_file from leaking since it's used in the require call
    require( $_file );
};
$scope( "RequiredFile.php", array() );
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

php scope global-variables

25
推荐指数
1
解决办法
2686
查看次数

使用Game Center登录在远程服务器上引导登录

我想让用户使用他们的Game Center帐户自动在我的服务器上创建一个帐户.当我的iOS应用程序打开时,它需要与XMPP服务器进行连接和身份验证才能与游戏服务器通信.我正在尝试在GKLocalPlayer中找到一些内容,这是我可以用来创建/验证远程用户登录的登录设备的私有内容,但玩家唯一看来唯一的东西就是他们的playerID,这是相当公开的.

我真的不想将GameCenter用于所有内容,因为它将我的用户群分割为仅iOS设备.

来自developer.apple.com

...如果您的应用程序连接到您自己的网络服务,您可以使用服务上的播放器标识符来保存数据.

由于玩家标识符不是私有的,我们可以确定这不是伪造的吗?

iphone objective-c ios game-center

24
推荐指数
2
解决办法
3234
查看次数

为什么array_key_exists比引用数组上的isset慢1000?

我发现如果在数组引用中设置了一个键,则array_key_existsisset检查时慢1000倍.是否有人了解PHP的实现方式解释了为什么这是真的?

编辑:我添加了另一个案例,似乎指出在使用引用调用函数时需要开销.

基准示例

function isset_( $key, array $array )
{
    return isset( $array[$key] );
}

$my_array = array();
$start = microtime( TRUE );
for( $i = 1; $i < 10000; $i++ ) {
    array_key_exists( $i, $my_array );
    $my_array[$i] = 0;
}
$stop = microtime( TRUE );
print "array_key_exists( \$my_array ) ".($stop-$start).PHP_EOL;
unset( $my_array, $my_array_ref, $start, $stop, $i );

$my_array = array();
$start = microtime( TRUE );
for( $i = 1; $i < 10000; $i++ ) { …
Run Code Online (Sandbox Code Playgroud)

php performance reference isset array-key-exists

22
推荐指数
2
解决办法
9955
查看次数

可扩展,延迟的PHP处理

我正在开发一个需要延迟PHP事件的在线PHP应用程序.基本上我需要能够在初始命中URL之后执行任意PHP代码x很多秒(但可能是几天).我需要相当精确地执行这些PHP事件,我也希望它具有相当的可扩展性.我正在努力避免安排一个cron作业每秒运行一次.我正在研究Gearman,但它似乎没有提供任何计划事件的能力,据我所知,PHP并不真正意味着作为一个守护进程运行.

如果我能告诉一些外部进程在下一个事件应该运行的确切时间在PHP服务器上轮询"事件检查器"URL,那将是理想的.此轮询时间需要能够随意减少或增加,因为事件可以被删除并添加到队列中.有什么想法以优雅的方式来实现这一目标吗?从外部调用PHP(必须解析HTTP请求或通过CLI调用)只需要很多开销就可以满足我的需求.

我目前的计划是编写一个PHP守护程序,它将使用gearman从PHP服务器运行事件和接口.PHP守护进程将围绕SplMinHeap构建,所以希望性能不会太糟糕.这个想法在我的口中留下了不好的味道,我想知道是否有人有更好的主意?想法略有改变.阅读编辑2.

编辑:

我正在创建一个在线游戏,让玩家轮流使用可变时间限制.我正在使用XMPP和BOSH来允许我向客户推送消息,但是我已经完成了所有这些工作.现在我正在尝试添加一个任意事件,该事件在从客户端播放之后触发,以便让客户端(以及游戏中的其他人员)花费很长时间.我无法在客户端使用定时触发器,因为这样可以被利用(因为客户端可以自己玩).希望有所帮助.

编辑2:

谢谢大家的反馈.虽然我认为你的大多数想法在小范围内都能很好地发挥作用,但我觉得它们不能很好地扩展(外部事件管理器)或缺乏该项目所需的准确性(CRON).此外,在这两种情况下,它们都是外部部件,可能会失败并增加已经很复杂的系统的复杂性.

我个人觉得满足这个项目要求的唯一干净的解决方案是编写一个处理延迟事件的PHP守护进程.我已经开始编写我认为第一个 PHP runloop.它处理观察套接字和执行延迟的PHP事件.希望当我接近完成这个项目时,我可以发布源代码,如果你们有兴趣的话.到目前为止,在测试中它已经证明是有希望的解决方案(没有内存泄漏或不稳定的问题).

编辑3:这是一个名为LooPHP的PHP事件循环库的链接,供有兴趣的人使用.

TL; DR要求

  • 在延迟的时间(从几秒到几天)调用(最好是原生的)PHP
  • 任意处理事件的创建/更新/删除(我期待大量取消的电话).
  • 处理预定的高负荷事件(每台服务器100-1000秒)
  • 通话时间应在预定时间的一秒钟内
  • 在这一点上,我不愿意将代码库重写为另一种语言(也许有一天我会)

php events asynchronous daemon

19
推荐指数
2
解决办法
6025
查看次数