问题标签 [hacklang]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2473 浏览

php - 缺少查询字符串参数

这是一个非常奇怪的问题,我不知道在哪里可以找到解决方案。

执行 POST 请求,我可以从“file_get_contents('php://input')”获取请求参数。$_SERVER 变量也不为空。它包含数据。但无论 URL 中是否存在参数,$_GET 始终为空。$_SERVER["QUERY_STRING"] 对于 GET 请求方法也是空的。

我不知道如何解决这个问题。我尝试在严格和非严格模式下访问 $_GET 。总是同样的问题。可能缺少标题吗?这是我的要求和回应如下:

0 投票
2 回答
305 浏览

hhvm - HHVM 静态键入查找表并将它们完全缓存在 RAM 中

我正在做科学研究,通过数百万个兆字节数组的组合进行处理。

为了能够回答这个问题,您需要具备以下所有知识/经验

  • HHVM 如何在请求之间将数据结构缓存在 RAM 中
  • 如何告诉 HHVM 数据结构将保持不变
  • 如何声明数组索引和值类型

我需要处理整个数组,因此需要加载和处理大量数据。(局域网上数分钟内的数百万个请求)。我越快完成请求,我就能越快完成我的工作。如果 HHVM 必须在每个请求上加载这些数据,它会占用很大一部分时间来完成请求(有时超过一半,这取决于我当时正在进行的分析的复杂性)。

我找到了一种方法,可以让我将这些数据结构缓存在 RAM 中(不从文件加载,解释代码,无缘无故地向数组推送数十万次,没有毫无意义的重复反序列化等),因此我有消除了这种巨大的可测量延迟。

关于如何使这更快,我有 3 个问题:

  1. 我现在这样做的方式是否会造成全局范围的惩罚?
  2. 如何将我的数组声明为常量并告诉 HHVM 期望什么数据类型?如果我将我的数组声明为常量,是否甚至需要声明 HHVM 的类型?
  3. 如果我使用 3 个单独的数据结构 ImmVector、PackedArray 或定义一个类,而不是使用嵌套数组,它会更快吗?

请记住,任何阻止 HHVM 在请求之间将数据结构缓存到 RAM 中的行为都应该被视为不可接受的。

查找表35543.php

其中一些文件有很多 MB 大小,其中有很多 Main.php

这工作得很好,因为 Main.php 收到了数千个请求,在很短的时间内,HHVM 将 Lookuptable.php 的数据结构保存在内存中。避免无意义的处理和 IO,因为它只是位于 RAM 中,可供使用。(我有足够的内存)

不幸的是,我知道如何让 HHVM 将查找表保存在 RAM 中的唯一方法是,我在我的查找####.php 文件中的全局范围内设置 $data (然后将查找文件要求为数据处理中的函数文件:Main.php)?这样 HHVM 就不会费心加载文件或重新执行代码来创建 $data,因为它可以看到 $data 可以在编译时确定,并且在运行时它永远不会改变。这可行,但我不知道在查找###.php 文件的全局范围中存在 $data 是否会受到惩罚。(或者它可能根本不是全局的,因为它是required 进入 main.php 的函数?)

  1. 如果我从 Lookup.php 中的函数返回 $data 并像 Main.php 这样从 Main.php 调用该函数怎么办

HHVM JIT 会是 RAM 中 getData() 的结果吗?不知何故,我将函数与不可预测性联系起来......但也许 HHVM 足够聪明,知道函数结果可以在编译时确定,并且永远不会改变?

我不能将查找表放在 Main.php 中,因为我require根据请求的类型使用不同的查找表。

  1. 有没有办法告诉 HHVM 我的外部数组将始终具有一个永不改变的整数索引,并且外部数组的值将始终是一个数组?也许我需要使用 ImmVector?那么有没有办法告诉 HHVM 我的内部数组将始终是一个固定长度的字符串,后跟 2 个整数,总是,没有额外的元素,内容永远不会改变?

我宁愿不使用 OO 或创建一个类。如何声明类型、程序风格?如果课程是绝对必要的,您能否提供适合我上述要求的示例代码?

  1. 如果我不嵌套数组会更快吗?我刚刚意识到我可以拥有一个具有整数索引和固定长度字符串值的数组。然后是具有整数索引和整数值的第二个数组,以及具有整数索引和整数值的第三个数组。

如果您不熟悉这种 HHVM 缓存技术,请不要浪费时间建议数据库、redis、APC、反序列化等。HHVM 最快的方法是将我的各种 $data 变量保存在 RAM 中。即使从 ramdisk 文件中反序列化 $data 也很慢,因为必须将整个数据结构解析为字符串,并针对每个请求将其转换为内存中的数据结构。据我所知,APC 也有同样的问题。我什至不想复制 $data。查找表是不可变的,只读的。它们必须在 RAM 中保持完全结构化。我当前的缓存解决方案(在这个问题的顶部)已经给我带来了巨大的收益,但是根据我的 3 个问题,我认为可能会有更多的收益?

如果您想知道,我已经测量了各种数据加载或缓存方法的延迟。现在我基本上想保留我所拥有的缓存情况,但要让 HHVM JIT 对如何键入我的数据有最大的信心,这样它就可以节省不运行类型甚至绑定(数组大小)检查的时间。

编辑 好的,所以还没有人能给我任何代码示例,所以我只是在尝试一些东西。

这是我到目前为止所发现的。

  • const 数组在 HHVM 中还不能工作。const foo = ['uuid1',43,43]; 抛出有关 HHVM 仅支持具有标量值的常量的错误。

  • 带有数组值的向量:我还不知道它会如何执行......我希望它会比普通数组更好。这是有效的 HH 代码。

这是进步,因为 HHVM 应该能够以相同的方式缓存它,HHVM 知道整个结构是恒定的,并且 HHVM 知道索引都是整数。

我对这种结构仍然不完全满意的是:考虑这段代码

$if[$n][2]HHVM 会在每次循环迭代时执行类型检查吗?在我$iv上面的定义中,没有说内部数组的第二个元素是整数。我该如何改进呢?禁用类型检查器有什么用吗?这只是隐藏了外部类型检查器的错误,还是阻止了 HHVM 不断地进行类型检查?(我认为这是第一件事)

也许如果我可以创建自己的用户定义类型来解决问题?

我在 Hack Collections Literal Syntax Vector<Foo>找到了对此的参考,不幸的是它可能还不能使用。

0 投票
1 回答
127 浏览

php - Hack (PHP) ReflectionClass 以 Map 作为方法的默认属性失败

如果方法的签名将 Map 集合作为参数的默认值,则在使用 ReflectionClass 检查该方法时会引发错误。

该类看起来像:

并且反射错误发生在

该类在实际使用时会正确实例化。我只能使用反射创建错误。

问题

是否有什么我做错了,或者我缺少什么概念,才能使这项工作按预期进行?我希望getProperties返回该方法的属性,就像它对任何其他值/类型一样。

0 投票
1 回答
368 浏览

design-patterns - 如何在没有 Nullable 的情况下实现单例模式

我正在尝试在 Hack 中实现单例模式。但是,我一直遇到 Nullable 的问题。

执行时出现错误:

类型检查器也返回类似的结果:

如何为静态属性分配默认值?

0 投票
1 回答
256 浏览

php - HHVM 是否仅适用于 HACK?

HHVM 是 PHP 的新运行时。我已经在 Ubuntu 上安装了 hhvm。

但我怀疑我可以在 .hhvm 文件中编写 php 代码。

或者我必须安装 hack 并编写代码,如下所示

这是使用 HHVM(使用 PHP 或 HACK)的正确方法。

如果我完全错了,请告诉我 HACK、HHVM、PHP 之间的区别。

0 投票
1 回答
78 浏览

php - 使用 hhvm 进行堆栈溢出以适应严格的 Hack

由于 Hack 在严格模式下更快,我尝试将第一个benchmarkgame转换为 dito,但卡在了在非严格版本中从未发生过的堆栈溢出(与使用对象的递归调用不同?)。有什么理由吗?我怎样才能增加堆栈大小?正如您可以想象的那样,在谷歌上搜索“php 堆栈溢出”是没有用的。^^

问题发生在第一次递归调用上。

我的代码:

0 投票
1 回答
1785 浏览

hhvm - 使用 Watchman 设置 Nuclide IDE 和远程服务器

Facebook 最近宣布了支持远程开发和黑客的核素。

我已遵循所有安装说明,但autocomplete/inline error report/click-to-definition功能不起作用,而nuclide-language-hack, nuclide-file-tree/nuclide-remote-projects按预期工作(并且nuclide-server从服务器部分/.hhconfig文件包含在项目根目录中)。

除了flow过滤nuclide-.

这些功能在远程访问中是否不受支持,或者我在安装时出错了(我认为这很简单)?

此外,我不明白如何将守望者配置为正常工作。我已经使用以下命令安装了它(服务器运行 Linux,我也安装了inotify-tools

我用以下来观看我的项目

并且观察者似乎建立得很好。

然而核素报告:

观察者无法启动 - 观察者功能已禁用!

详情:socket挂断

很抱歉我在这里询问安装建议,但我认为也不应该在 Github 上询问以上内容。

谢谢!


解决方案:正如 MostafaEweda 建议的那样,我尝试从源代码编译。apm或通过原子设置安装包,对我不起作用。nuclide-installer根本没有安装任何东西,手动安装nuclide-*包也不起作用。

对于Windows Users:Python3.4 会引发一些运行时错误(尽管文档说支持 Python 2.6 或更高版本)。我使用了 Python2.7,这些错误似乎消失了。

提示:当您安装核素时,您必须等待几分钟,原子将变得无响应。要有耐心!

0 投票
1 回答
389 浏览

c++ - 在 Centos 7 上安装 HHVM 时出现“内部编译器”错误

我需要在我的 Linux 服务器上安装 HHVM 以使我的 hacklang 工作。但我在安装过程中收到此错误消息

0 投票
1 回答
26 浏览

hhvm - 编译部分 Hack 时找不到 OCaml 模块 FileInfo

我正在尝试编译 Hack 编译器的某些部分,特别是 parser/lexer/ast 部分,但缺少 FileInfo 模块。它是用C制作的吗?我将如何包含它?

0 投票
1 回答
1088 浏览

hhvm - Hacklang - 按值搜索地图

G'day

在严格模式下,有没有办法通过值而不是键来搜索地图?

假设我有一张地图:

我怎么能通过价值搜索?