我要做的是从数据库或从memcache异步加载一些数据.
我知道我知道."PHP不支持线程".
但是register_tick_function怎么样?这不是真正的线程吗?
有没有人使用register_tick_function进行任何预测预加载或任何后台处理?
在Excel中,是否有早期选择退出AND功能(也称为短路评估)?
例如:
=AND(FALSE, #N/A)
Run Code Online (Sandbox Code Playgroud)
返回#N/A. 如果函数是"早期选择退出",则一旦找到第一个FALSE就会返回FALSE,因为没有其他值可以使函数返回true.
excel中是否存在这样的功能?
我一直在阅读SO和其他地方,但我似乎无法找到任何结论.
有没有办法通过此调用堆栈有效地携带引用,从而产生所需的功能,如下面的示例所述?虽然该示例并未尝试解决此问题,但它确实说明了问题:
class TestClass{
// surely __call would result similarly
public static function __callStatic($function, $arguments){
return call_user_func_array($function, $arguments);
}
}
// note argument by reference
function testFunction(&$arg){
$arg .= 'bar';
}
$test = 'foo';
TestClass::testFunction($test);
// expecting: 'foobar'
// getting: 'foo' and a warning about the reference
echo $test;
Run Code Online (Sandbox Code Playgroud)
只关注call_user_func_array(),我们可以确定(至少在PHP 5.3.1中)你不能通过引用隐式传递参数:
function testFunction(&$arg){
$arg .= 'bar';
}
$test = 'foo';
call_user_func_array('testFunction', array($test));
var_dump($test);
// string(3) "foo" and a warning about the non-reference parameter
Run Code Online (Sandbox Code Playgroud)
通过显式传递数组元素$test …
我们都知道这个错误:
Fatal error: Out of memory (allocated 32016932) (tried to allocate 25152 bytes)
Run Code Online (Sandbox Code Playgroud)
有办法处理这个错误吗?也许是执行的函数调用?这不是真正的堆栈溢出,它是系统强加的限制.人们会认为这里会有一点灵活性.我在本地缓存大量数据进行处理,但我有一个垃圾收集功能.我已经有功能设置来检查内存使用情况和可用内存是否超过一定限度,但我有时会错过.如果我可以在这个"致命"错误上调用我的函数......那么,在一个理想的世界中,程序应该能够恢复.
我的php.ini设置是memory_limit = 500M.
有什么想法吗?
非常感谢所有对此发表评论的人,但感谢@Wrikken提出的出色建议.
这是我最终做的事情:
declare(ticks=1);
register_tick_function('TickFunction');
function TickFunction() {
if(memory_get_usage()>220000000) // 220M
{
GlobalDataStore::CheckMemory(); // my garbage collection function
}
}
Run Code Online (Sandbox Code Playgroud)
我的php.ini内存限制设置远远高于我想要运行的内存限制,并且tick函数负责内存监控并根据需要释放内存.
我正在阅读工厂方法.有人可以解释为什么建议工厂方法位于一个单独的工厂类中吗?
我从这里开始我的例子:http://www.devshed.com/c/a/PHP/Design-Patterns-in-PHP-Factory-Method-and-Abstract-Factory/
class ETF {
var $data;
function __construct($data) {
$this->data = $data;
}
function process() {}
function getResult() {}
}
class VirtualCheck extends ETF {}
class WireTransfer extends ETF {}
class ETFFactory {
function createETF($data) {
switch ($data[‘etfType’]) {
case ETF_VIRTUALCHECK :
return new VirtualCheck($data);
case ETF_WIRETRANSFER :
return new WireTransfer($data);
default :
return new ETF($data);
}
}
}
$data = $_POST;
$etf = ETFFactory::createETF($data);
$etf->process();
Run Code Online (Sandbox Code Playgroud)
我倾向于这样写:
class ETF {
final public static function factory($data) { …Run Code Online (Sandbox Code Playgroud) 我正在读这篇文章:http://www.dereleased.com/2011/04/27/the-importance-of-zvals-and-circular-references/
还有一个让我失望的例子.
$foo = &$bar;
$bar = &$foo;
$baz = 'baz';
$foo = &$baz;
var_dump($foo, $bar);
/*
string(3) "baz"
NULL
*/
Run Code Online (Sandbox Code Playgroud)
如果你一直在跟随,这应该是完美的意义.创建$ foo,并指向由$ bar标识的ZVal位置; 当$ bar创建时,它指向$ foo被指向的相同位置.当然,该位置为空.当$ foo被重新分配时,唯一改变的是ZVal $ foo指向的内容; 如果我们首先为$ foo分配了不同的值,那么$ bar仍将保留该值.
我学会了用C编程.我知道PHP是不同的,它使用ZVals而不是内存位置作为参考.但是当你运行这段代码时:
$foo = &$bar;
$bar = &$foo;
Run Code Online (Sandbox Code Playgroud)
在我看来,会有两个ZVals.在C中,将存在两个存储器位置(并且值将是相反的存储器位置).
谁能解释一下?
我有两个不同的环境运行相同的git存储库.它看起来像在AWS控制台工具中用于git和弹性beanstalk,我一次只能连接一个环境,无论如何都要同时推送到我的两个环境?