标签: php-internals

PHP如何为变量分配和释放内存?

我想知道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)

php memory variables memory-management php-internals

11
推荐指数
1
解决办法
2982
查看次数

zend自定义模块

我正在尝试构建自己的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)

c tree php-extension nodes php-internals

11
推荐指数
1
解决办法
136
查看次数

C PHP扩展对象持久性

我为我编写的服务器应用程序开发了一个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 c php-internals

11
推荐指数
1
解决办法
288
查看次数

编写PHP操作码并执行它.怎么做?

如何编写PHP操作码,将其保存在文件中并使Zend Engine执行它?任何方法或黑客都是受欢迎的,只要它能够解决问题.

php opcode php-internals

10
推荐指数
1
解决办法
1853
查看次数

关于PHP 7 refcount的困惑

<?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 5 refcount

在PHP 7.0.2中运行

php 7 refcount

我认为结果(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-c​​hanged-internally

SlideShare上

php php-internals

10
推荐指数
1
解决办法
716
查看次数

PHP在调用之前是否读取了函数?

我声明了100个函数,但我实际上并没有调用它们中的任何函数.定义了如此多的函数会影响加载时间吗?

PHP在调用之前是否处理这些函数?

php performance php-internals

10
推荐指数
1
解决办法
512
查看次数

PHP被称为"二进制安全"的功能是什么?这些"非二进制安全"函数向哪些库移除字符串?为什么?

我正在使用Windows 10 Home Single Language Edition,它是我机器上的64位操作系统.

我安装了最新版本的XAMPP,它在我的机器上安装了PHP 7.2.7.

我根据PHP手册中的摘录问这个问题:

PHP中的字符串实现为字节数组和表示缓冲区长度的整数.它没有关于这些字节如何转换为字符的信息,将该任务留给程序员.字符串可以组成的值没有限制; 特别是,字符串中的任何地方都允许使用值为0的字节("NUL字节")(但是,本手册中称为"二进制安全"的一些函数)可能会将字符串移交给忽略数据后的数据库. NUL字节.)

我非常理解PHP中二进制安全函数和非二进制安全函数之间的区别.我心中怀疑.请以一对一的方式回答它们,并附上适当的解释和适当的例子.

  • PHP中是否存在"非二进制安全"和"二进制安全"函数的现象,因为整个PHP解析器都是用C语言编写的?
  • 在处理包含任何值的字符串(包括NUL字节)时,C和PHP之间有什么区别?
  • 我想要PHP中的完整功能列表,这些功能是"非二进制安全的"并且是"二进制安全的".
  • 是"非二进制安全"和"二进制安全"只适用于操纵在串并不能适用于其他类型的PHP处理PHP函数功能的特点呢?
  • 为什么非二进制安全函数将字符串移交给库?
  • 只有当它们处理的字符串包含NUL字节时,非二进制安全函数才会将字符串移交给库吗?
  • 那些"非二进制安全"函数将这些字符串移交给哪些库?
  • 这些库如何处理从"非二进制安全"函数接收的字符串?
  • 在将包含NUL字节的字符串移交给某个库之后,"非二进制安全"函数是否像"二进制安全"函数一样工作?

php string php-internals

10
推荐指数
2
解决办法
318
查看次数

在这种简单的情况下,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 oop interface return-type php-internals

9
推荐指数
1
解决办法
109
查看次数

如何使用eclipse检查php函数源代码

我很好奇某些PHP函数是如何在内部实现的.例如array_values().

所以在eclipse中,我control click在函数名称上,它将我带到一个包含函数原型定义的页面,但不包含内部源代码.

在此输入图像描述

有没有办法看到使用eclipse的php函数的内部实现?(函数是用php还是c编写的)

如果不可能使用eclipse看到php源代码,那么有没有人有任何好的策略来搜索github上php源代码

php eclipse php-internals

9
推荐指数
1
解决办法
238
查看次数

为什么in_array整数严格模式比非严格模式慢?

我一直认为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 php-internals

9
推荐指数
1
解决办法
148
查看次数