我正在尝试从PHP 5.4(使用FPM作为FastCGI和apc)在nginx上迁移到HHVM - FastCGI(也是nginx).
我的应用程序是一个以Slim为框架的广告服务器.广告服务器连接到redis,memcached(用于套接字和http),MySQL,MongoDB(这些端点在HHVM版本中禁用),使用SOAP和beanstalkd连接到Java后端.
该应用程序有一个测试端点,计算一个Fibonacci系列,在请求11之后速度非常棒!
但是......其他终端的基准在hhvm中更糟糕(当然,在请求11之后).
我认为这总是hhvm模式解释器.
一些想法?
谢谢!
环境:
8个处理器和8GB RAM.
$ uname -a
Linux 3.13.0-30-generic #55-Ubuntu SMP Fri Jul 4 21:40:53 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04 LTS
Release: 14.04
Codename: trusty
Run Code Online (Sandbox Code Playgroud)
我编译了hhvm,因为我修改了phpredis:
$ hhvm --version
HipHop VM 3.2.0-dev (rel)
Compiler: heads/master-0-gb7802e739a1f16808dd06c57754c1dc77ed80054
Repo schema: acdee0ea91d0b5967c60a0a42f5dbf81433a7821
Run Code Online (Sandbox Code Playgroud)
测试:
斐波纳契测验
PHP
1.1112360954285
Run Code Online (Sandbox Code Playgroud)
HHVM
1.7104048728943
1.7193510532379
1.7104179859161
1.713366985321
1.7120008468628
1.7102618217468
1.7118058204651
1.7113170623779
1.7101211547852
1.7117080688477
1.7127840518951
0.10136723518372
Run Code Online (Sandbox Code Playgroud)
地理定位测试(SOAP) …
我能够启动HipHop VM以使用unix套接字.我可以通过以下方式实现:
/usr/bin/hhvm --config /etc/hhvm/server.ini --mode daemon -vPidFile=/var/run/hhvm/pid -vServer.Type=fastcgi -vServer.FileSocket=/var/run/hhvm/hhvm.sock
Run Code Online (Sandbox Code Playgroud)
但是,我无法在任何地方找到参考,如何在ini我为配置指定的文件中设置它.要使用TCP端口,server.ini中的行是:
hhvm.server.port = 9000
Run Code Online (Sandbox Code Playgroud)
我试过了两个
hhvm.server.filesocket=/var/run/hhvm/hhvm.sock
hhvm.server.socket=/var/run/hhvm/hhvm.sock
Run Code Online (Sandbox Code Playgroud)
两者都失败了 任何人都知道文件设置或可以找到这些设置的参考?
我注意到我的Laravel API没有将实体标识符(主键)作为整数返回.
在Api\PostController.php :: show()中:
function index()
{
$posts = Post::all();
return $posts;
}
Run Code Online (Sandbox Code Playgroud)
返回的内容如下:
[{
"id": "1",
"title": "Post one",
...
},{
"id": "2",
"title": "Post two",
...
}]
Run Code Online (Sandbox Code Playgroud)
这会弄乱我的表排序(因为ID将被排序为字符串:1,10,11,2等).
转储实体本身也表明该id属性是一个字符串.
如前所述这里可能的原因是,MySQL驱动程序不会在适当类型的返回值.
我在Ubuntu 14.04服务器上使用HHVM 3.3.1.有什么方法可以使用本机MySQL库(如php5-mysqlnd)用于HHVM吗?
我可以使用Laravel模型访问器来解决问题.但这更像是一个黑客IMO.
请帮忙!
参考文献:
编辑:我已经确认它不是Laravel的ORM层.PDO实例已将ID作为字符串返回.
我试图在虚拟Ubuntu 12.04(64位服务器)安装上通过HHVM运行PHPUnit单元测试.测试通常使用位于我的tests目录中的phpunit.xml文件运行,该文件包含一个用于处理自动加载的引导文件,并且测试在普通的php安装上运行良好.但是,我一直在:
HipHop Fatal error: File not found: File/Iterator/Autoload.php in /usr/share/php/PHPUnit/Autoload.php on line 64
Run Code Online (Sandbox Code Playgroud)
运行时:
hhvm -f /usr/bin/phpunit /path/to/my/testsDirectory/SomeTest.php
Run Code Online (Sandbox Code Playgroud)
我还没有弄清楚如何使用bootstrap或配置文件在hhvm下运行phpunit ...任何帮助将不胜感激.
我已经花了很长时间来解决这个问题,而且我无法理解nginx + hhvm如何映射我的请求.
基本上,我在api.example.com上有一个API,我想用Accept:application/vnd.com.example.api.v1 + json调用版本1和application/vnd.com.example.api.v2 + json for version 2. API本身是一个PHP应用程序,我将使用全新安装的HHVM运行.所有请求都将由index.php处理.
api.example.com/
index.php (content: fail)
v1/
index.php (content: v1)
v2/
index.php (content: v2)
Run Code Online (Sandbox Code Playgroud)
每当我使用我的REST客户端访问带有v1接受标头的api.example.com/test时,我都会收到v1响应.当我使用v2的accept标头时,它会显示v2.所以一切都是正确的.如果我不提供任何接受标题,我会被重定向到example.com
map $http_accept $api_version {
default 0;
"application/vnd.com.example.api.v1+json" 1;
"application/vnd.com.example.api.v2+json" 2;
}
server {
# listen to :80 is already implied.
# root directory
root /var/www/api.example.com/;
index index.html;
server_name api.example.com;
include hhvm.conf;
location / {
if ($api_version = 0) {
# redirect to example.com if applicable
# Accept-header is missing
return 307 http://example.com;
} …Run Code Online (Sandbox Code Playgroud) 我有一个安装了Memcache的Drupal 7网站,它在Apache2 Web服务器上运行良好.现在我已经用HHVM(HipHop)替换了Apache2,并且在性能上得到了真正的提升.
问题是显然Drupal无法与Memcache服务器交互.这是错误:
Notice: Use of undefined constant MEMCACHE_COMPRESSED - assumed 'MEMCACHE_COMPRESSED' in dmemcache_set() (line 44 of /.../modules/memcache/dmemcache.inc).
Run Code Online (Sandbox Code Playgroud)
当然,没有任何内容存储在Memcache中.
我想Drupal的Memcache模块正在使用PECL Memcache:set(),这在新安装的HHVM中是不可用的.HHVM是否有类似PECL的安装?
谢谢
好吧,我刚开始使用hhvm/hack.但是我想向浏览器显示错误,但没有让它工作.
我按照以下方式设置了ini设置
error_reporting(E_ALL);
ini_set('display_errors', '1');
Run Code Online (Sandbox Code Playgroud)
根据var_dump ini_get的值设置为
string(5) "32767"
string(1) "1"
Run Code Online (Sandbox Code Playgroud)
但是当我这样做的时候
<?hh
error_reporting(E_ALL);
ini_set('display_errors', '1');
throw new InvalidArgumentException('test');
Run Code Online (Sandbox Code Playgroud)
当我通过浏览器访问页面时,我会得到一个白色屏幕和一个500 http头.所以没有解释致命/异常错误.
然而,我会通过终端hhvm index.php它会显示;
Fatal error: Uncaught exception 'InvalidArgumentException' with message 'test' in /var/www/public/index.php:3
Stack trace:
#0 {main}
Run Code Online (Sandbox Code Playgroud)
所以现在问题.怎么来我在浏览器中没有收到任何消息,但在cli中做什么?第二个是,我如何让它在浏览器中工作以显示消息.
我遇到了这个问题和这个问题.但第一个,好的是相同的,但是没有答案.第二个是关于静态检查的说法.IE给出了一个int等,至少这是我认为他的意思.
我来的其他问题,看起来像我的,但又没有答案.
根据文档,它应该工作,我猜.
阅读更多关于我遇到的文档
尽管display_errors可以在运行时设置(使用函数ini_set()),但如果脚本存在致命错误,则不会产生任何影响.这是因为未执行所需的运行时操作.
所以我认为异常是一个致命的错误,所以我就这么做了 $test = $bar + 1;
这让cli来了
Notice: Undefined variable: bar in /var/www/public/index.php on line 8
int(1)
Run Code Online (Sandbox Code Playgroud)
再次在浏览器中
int(1)
Run Code Online (Sandbox Code Playgroud)
所以我也没有收到通知.
当我重新启动hhvm时,service hhvm restart我也收到错误消息 …
我今天开始学习hacklang,现在我有点卡在形状上:http: //docs.hhvm.com/manual/en/hack.shapes.php
我理解形状的概念,它似乎对我很有用,但我无法理解为什么例如这段代码不会抛出任何错误:
<?hh
type Point2D = shape('x' => int, 'y' => int);
function dotProduct(Point2D $a, Point2D $b): int {
return $a['x'] * $b['x'] + $a['y'] * $b['y'];
}
function main_sse(): void {
echo dotProduct(shape('x' => 3, 'y' => 'this should cause an fatal error?'), shape('x' => 4, 'y' => 4));
}
main_sse();
Run Code Online (Sandbox Code Playgroud)
'y'键定义为整数,但是当我传递一个字符串时,不会显示错误.谢谢你的帮助 :)
我似乎无法配置HHVM和Apache,它一直给我一个404文件未找到错误.我的网站配置文件保存为www.example.com.conf,它包含:
<VirtualHost *:80>
ServerName website.com
ServerAdmin mail@website.com
DocumentRoot /var/www/website.com/public_html/
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/website.com.com/public_html/$1
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
请注意,我删除了我的实际网站名称,但它是针对子域名的,所以就是这样:subdomain.xyz.com.我已经尝试过如何解决这个问题,但无论我尝试过什么似乎都不起作用; 甚至人们在官方存储库上发布的GitHub问题似乎也不起作用.我也没有更改默认的apache配置,我唯一改变的是我的网站的根目录,它完成了上面配置文件中的目录.
有任何想法吗?谢谢.
我是一个MAC用户,并在VM"ubuntu 14.04"中安装了docker.(我手动安装了一切,不使用docker工具箱)
问题是当我启动特定容器(其他容器正常运行)时,它给了我这个奇怪的错误消息" 无法找到替代的telinit实现来生成 ".
这是我用来构建映像的Dockerfile:
FROM diegomarangoni/hhvm:cli
# install php composer.
# It needs git and the PHP zip extension
# zlib1g-dev is needed to compile the PHP zip extension
# openssh-client provides ssh-keyscan
RUN apt-get update \
&& apt-get install --assume-yes --no-install-recommends curl git zlib1g-dev openssh-client \
&& apt-get clean && rm -r /var/lib/apt/lists/* \
&& curl -sS https://getcomposer.org/installer -o installer \
&& hhvm -v ResourceLimit.SocketDefaultTimeout=30 -v Http.SlowQueryThreshold=30000 installer \
&& mv composer.phar /usr/local/bin/composer \
&& …Run Code Online (Sandbox Code Playgroud)