Websocket在本地工作,但不能在Heroku-PHP应用程序上工作

Websocket在本地工作,但不能在Heroku-PHP应用程序上工作,php,heroku,websocket,Php,Heroku,Websocket,我很久没用Heroku了,所以我有点生疏了。 我创建了一个运行Ratchet IOServer的小型PHP应用程序。它监听端口5000。如果我运行heroku local并连接到telnet localhost 5000,一切似乎都正常。我尝试了几种让PHP进程运行并接受连接的方法 我的proc文件如下所示 web: php bin/console bot:start 正在运行heroku local Downloading forego-0.16.1 to /Users/roje/.hero

我很久没用Heroku了,所以我有点生疏了。 我创建了一个运行Ratchet IOServer的小型PHP应用程序。它监听端口5000。如果我运行heroku local并连接到telnet localhost 5000,一切似乎都正常。我尝试了几种让PHP进程运行并接受连接的方法

我的proc文件如下所示

web: php bin/console bot:start
正在运行heroku local

Downloading forego-0.16.1 to /Users/roje/.heroku... done
forego | starting web.1 on port 8080
web.1  | It works!
web.1  | New connection! (97)
web.1  | Connection 97 sending message "sdfdfs"
当我将服务器部署到Heroku时,它无法工作。 当我尝试远程登录到端口
5000
上的盒子时,我得到

telnet myapplication.herokuapp.com 5000
Trying 46.137.127.234...
telnet: connect to address 46.137.127.234: Connection refused
telnet: Unable to connect to remote host
日志显示了更多的信息

2016-03-19T16:08:27.258081+00:00 heroku[web.1]: State changed from crashed to starting
2016-03-19T16:08:29.754688+00:00 heroku[web.1]: Starting process with command `php bin/console bot:start`
2016-03-19T16:08:31.659074+00:00 app[web.1]: It works!
2016-03-19T16:09:29.999903+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2016-03-19T16:09:29.999903+00:00 heroku[web.1]: Stopping process with SIGKILL
2016-03-19T16:09:30.638659+00:00 heroku[web.1]: Process exited with status 137
2016-03-19T16:09:30.660710+00:00 heroku[web.1]: State changed from starting to crashed
2016-03-19T16:18:51.610894+00:00 heroku[web.1]: State changed from crashed to starting
2016-03-19T16:18:55.208396+00:00 heroku[web.1]: Starting process with command `php bin/console bot:start`
2016-03-19T16:18:56.648708+00:00 app[web.1]: It works!
2016-03-19T16:19:55.569256+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2016-03-19T16:19:55.569256+00:00 heroku[web.1]: Stopping process with SIGKILL
2016-03-19T16:19:56.252235+00:00 heroku[web.1]: Process exited with status 137
2016-03-19T16:19:56.264205+00:00 heroku[web.1]: State changed from starting to crashed
有什么建议吗

编辑#1

我刚刚读了关于Heroku分配动态端口的部分

我试着改为在那个端口上收听,但仍然无法通过。telnet。虽然我有一些有趣的日志。也许你们中的一些人正在尝试IP地址

2016-03-19T16:38:35.577130+00:00 app[web.1]: It works!
2016-03-19T16:38:35.827466+00:00 app[web.1]: New connection! (97)
2016-03-19T16:38:35.827531+00:00 app[web.1]: Connection 97 has disconnected
2016-03-19T16:38:35.832097+00:00 app[web.1]: New connection! (107)
2016-03-19T16:38:35.832160+00:00 app[web.1]: Connection 107 has disconnected
2016-03-19T16:38:49.891455+00:00 app[web.1]: New connection! (108)
2016-03-19T16:38:49.891506+00:00 app[web.1]: Connection 108 has disconnected
2016-03-19T16:40:54.694321+00:00 app[web.1]: New connection! (109)
2016-03-19T16:40:54.694368+00:00 app[web.1]: Connection 109 has disconnected
不过我还是会犯同样的错误

Trying 176.34.255.126...
telnet: connect to address 176.34.255.126: Connection refused
telnet: Unable to connect to remote host

我能够使用nginx作为web套接字前面的代理来管理它

程序文件:

web: private/bin/start_socket vendor/bin/heroku-php-nginx -C nginx_app.conf
web: bash start vendor/bin/heroku-php-nginx -C nginx.conf
启动U插座:

php private/bin/start_socket.php &
exec "$@"
启动\u socket.php:

<?php
require_once(dirname(dirname(__DIR__)) . '/vendor/autoload.php');
require_once(__DIR__ . '/socket/socket.php');

use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new Socket()
        )
    ),
    8085
);
$server->run();

现在可以像这样访问套接字:ws://myapp.com/wss?mydata=test。这并不能回避每个dyno都将运行自己独特的WebSocket服务器这一事实,但这是一个完全独立的问题。

根据Floss的回答。。。这就是我为使用bloatless/php websocket的websocket提供服务的原因。类似的东西可能也适用于Ratchet

程序文件:

web: private/bin/start_socket vendor/bin/heroku-php-nginx -C nginx_app.conf
web: bash start vendor/bin/heroku-php-nginx -C nginx.conf
开始:

php server.php &
exec "$@"
nginx.conf:

location /wss {
    proxy_pass http://localhost:8085;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}
location /app {
    proxy_pass http://localhost:1112;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Sec-WebSocket-Protocol $http_sec_websocket_protocol;
    proxy_set_header Sec-WebSocket-Extensions $http_sec_websocket_extensions;
    proxy_set_header Sec-WebSocket-Key $http_sec_websocket_key;
    proxy_set_header Sec-WebSocket-Version $http_sec_websocket_version;
}
server.php
将是为websockets应用程序提供服务的任何php文件

:1112
将是您设置WebSocket应用程序运行的任何端口

/app
将是您需要为Bloatless设置的应用程序名称

注意:根据您使用的客户端,可能还需要设置其他websocket标题。可在此处找到websocket标题的完整列表:

我认为Heroku不允许您从外部连接到80或443以外的任何设备。请参阅-您的端口5000就在实例中,但Heroku的路由器不会将其路由到外部。我尝试在Heroku在环境变量中动态定义的端口上启动IOServer。在这种情况下,端口被分配为
40220
。还是没有运气。这种方法确实有效,谢谢!这个答案应该被接受。我一直在寻找一种方法,将WS设置为与我的主要后端进程一起工作的方式,但我认为这是不可能的:(对此有何想法?