我想知道PHP何时释放用于变量的内存
例如
function foo(){
$foo = 'data';
return $foo; // <- is the memory space for `$foo` emptied at this point?
}
Run Code Online (Sandbox Code Playgroud)
是慢于:
function foo(){
return 'data';
}
Run Code Online (Sandbox Code Playgroud)
?
我正在尝试构建自己的zend模块(.so)
我们有多种功能可以在我们自己的模块中完成,这将提高我们在高流量网站上的性能(每天50k +访问).
这些都是简单的模块,但我想知道zend使用的语言类似于C什么?
将当前的C代码转换为Zend代码有多容易?
例:
我想检查一下树中有多少个节点:
int nbNodes(Nodes *n, int *err) {
// count how many nodes a tree has
// Nodes *n = root of the tree
*err = 0;
if(emptyTree(n ,err)) {
return 0;
}
return nbNodes(n->leftSide, err) + nbNodes(n->rightSide, err) +1);
}
Run Code Online (Sandbox Code Playgroud) 我为我编写的服务器应用程序开发了一个PHP5客户端扩展,到目前为止它工作得很好,但它还不支持持久连接.由于这是我想在发布第一个稳定版本之前实现的东西,我正在搜索有关持久性的文档,并找到了持久分配例程(pemalloc,pecalloc等).我无法理解的是如何在新请求时检索持久分配的对象,我的意思是,假设连接的持久ID是:
<hostname>:<port>:<timeout>
Run Code Online (Sandbox Code Playgroud)
我如何保存(或检查它是否已经创建)连接对象(这是一个C结构,而不是zval或严格与PHP相关的任何东西)?我怎么能在以后找到它的ID?
PS:我知道PHP持久流(我已经研究了pfsockopen C源代码),但我使用的是C客户端库,所以我无法直接访问套接字或修改C客户端库以使用php流而不是普通套接字.
谢谢.
如何编写PHP操作码,将其保存在文件中并使Zend Engine执行它?任何方法或黑客都是受欢迎的,只要它能够解决问题.
<?php
$s = "foobar";
$t = $s;
$u = $s;
echo PHP_VERSION . "\n";
debug_zval_dump($s);
xdebug_debug_zval('s');
Run Code Online (Sandbox Code Playgroud)
在PHP 5.6.16中运行
在PHP 7.0.2中运行
我认为结果(PHP 7)应该是:
string(6) "foobar" refcount(4)
s: (refcount=3, is_ref=0)="foobar"
Run Code Online (Sandbox Code Playgroud)
我想知道是什么产生了影响?需要一些解释.非常感谢.
------更新------
Nikita Popov's - PHP 7 - 内部发生了什么变化?(P41)
http://www.slideshare.net/nikita_ppv/php-7-what-changed-internally
我声明了100个函数,但我实际上并没有调用它们中的任何函数.定义了如此多的函数会影响加载时间吗?
PHP在调用之前是否处理这些函数?
我正在使用Windows 10 Home Single Language Edition,它是我机器上的64位操作系统.
我安装了最新版本的XAMPP,它在我的机器上安装了PHP 7.2.7.
我根据PHP手册中的摘录问这个问题:
PHP中的字符串实现为字节数组和表示缓冲区长度的整数.它没有关于这些字节如何转换为字符的信息,将该任务留给程序员.字符串可以组成的值没有限制; 特别是,字符串中的任何地方都允许使用值为0的字节("NUL字节")(但是,本手册中称为"二进制安全"的一些函数)可能会将字符串移交给忽略数据后的数据库. NUL字节.)
我非常理解PHP中二进制安全函数和非二进制安全函数之间的区别.我心中怀疑.请以一对一的方式回答它们,并附上适当的解释和适当的例子.
在PHP 7.1.4中,使用严格类型,我有一个简单的面向对象的设置,涉及一些接口,以及一些实现这些接口的类.下面的例子,如你所料,工作正常.
declare(strict_types=1);
interface Loginable {
public function login();
}
interface Upgradeable {
public function upgrade(): Loginable;
}
class Person implements Upgradeable {
function upgrade(): Loginable {
return new PersonAccount();
}
}
class PersonAccount implements Loginable {
public function login() {
;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意Upgradable接口中的升级功能如何需要Loginable返回类型,这是另一个接口.在此示例中,Person类内的升级方法将Loginable接口指定为其返回类型,以匹配接口的规定.
但是,如果我现在尝试更准确地指定Person类的升级方法的返回类型,则会遇到致命错误.
class Person implements Upgradeable {
function upgrade(): PersonAccount {
return new PersonAccount();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我在这里要完成的是指定升级方法将返回一个对象,该对象根据类实现的接口实现所需返回类型的接口.这对我来说似乎非常合乎逻辑和正确,但PHP会说:
致命错误:Person :: upgrade()声明:PersonAccount必须与Upgradeable :: upgrade()兼容:可登录[...]
正如yivi已经在/sf/answers/3454715351/指出的那样,我想要实现的目标是不可能的.
如果涉及扩展类,我会接受PHP的抱怨,因为扩展类可以覆盖原始方法,这样就不能保证正确的返回类型.但是,在上述场景中,不扩展类.只有接口的实现,其目的是明确保证正确的实现.
请详细说明PHP拒绝接受上述声明返回类型的方法背后的原因!
我很好奇某些PHP函数是如何在内部实现的.例如array_values().
所以在eclipse中,我control click在函数名称上,它将我带到一个包含函数原型定义的页面,但不包含内部源代码.
有没有办法看到使用eclipse的php函数的内部实现?(函数是用php还是c编写的)
我一直认为in_array严格模式会更快,或者至少与非严格模式相同。但是在进行一些基准测试后,我发现在搜索整数时它们之间的执行时间存在巨大差异。字符串和数组测试表明严格模式更快。为什么?
测试代码-(PHP 7.2.1):
<?php
$array = array_fill(0, 10000, 12345);
for ($i=0; $i<100000; $i++) {
in_array($i, $array, true);
}
Run Code Online (Sandbox Code Playgroud)
时间php test.php
php -c test.php 12.98s用户0.04s系统98%cpu 13.234
<?php
$array = array_fill(0, 10000, 12345);
for ($i=0; $i<100000; $i++) {
in_array($i, $array, false);
}
Run Code Online (Sandbox Code Playgroud)
时间php test.php
php -c test.php 6.44s用户0.04s系统99%cpu 6.522
php-internals ×10
php ×9
c ×2
eclipse ×1
interface ×1
memory ×1
nodes ×1
oop ×1
opcode ×1
performance ×1
return-type ×1
string ×1
tree ×1
variables ×1