问题标签 [plack]

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 投票
2 回答
472 浏览

perl - 多站点感知 PSGI 应用程序开发

Plack::Builder允许挂载多个主机,例如以下代码段:

例如

  • load_site_names返回一个站点列表,如, http://example.com, http://some.other.site.com...
  • 每个“虚拟主机”都将使用相同的Some::PsgiFramework::MyApp
  • 只是他们的配置不同

我完全需要上述内容 - 需要开发一个简单的 Web 应用程序,该应用程序应该部署在不同(低流量)站点上,并且不希望为每个站点设置不同的 PSGI 服务器。

然而,Plack 的作者自己说(在Plack::Request中)

请注意,此模块旨在供 Plack 中间件开发人员和 Web 应用程序框架开发人员使用,而不是应用程序开发人员(最终用户)。

直接使用 Plack::Request 编写您的 Web 应用程序当然是可能的,但不建议这样做:这就像使用 mod_perl 的 Apache::Request: 这样做一样,但是级别太低了。

如果您正在编写 Web 应用程序,而不是框架,那么我们鼓励您使用支持 PSGI ( http://plackperl.org/#frameworks ) 的 Web 应用程序框架之一,或者查看诸如 HTTP::Engine 之类的模块在 PSGI 之上提供更高级别的请求和响应 API。

这就是问题所在。

我在 MetaCPAN 中检查了许多不同的基于 PSGI 的框架。并且AFAIK每个都是基于单例的,例如,不允许编写可以为同一个不同站点多次共享(安装)的应用程序app.psgi

所以问题是:

  • 我错过了 MetaCPAN(或文档)中的某些内容,并且这里存在 任何app.psgi(轻量级)网络框架,它允许开发可在?中多次安装的应用程序。
  • 还是我被迫发展Just Another My Own PSGI Framework?(老实说,我没有检查催化剂——因为它太重了)
  • 或者只是对“安装”有很深的理解?
0 投票
1 回答
683 浏览

perl - 舞者唯一请求 ID

Dancer 中是否有任何唯一的请求 ID?

Apache 有 mod_unique_id:http ://httpd.apache.org/docs/current/mod/mod_unique_id.html

PSGI/Plack 有一个中间件模块:http ://search.cpan.org/~bayashi/Plack-Middleware-RequestId-0.02/lib/Plack/Middleware/RequestId.pm

但是我错过了 Dancer 中的任何原生内容吗?

0 投票
1 回答
86 浏览

perl - PSGI - 每个 prefork-child 的构造函数

我对分叉后每个孩子的构造函数有疑问。例如:

此代码有效,但这是不好的做法。我想创造类似的东西

我希望有人向我解释它如何通过像 Starman 或 Feersum 这样的 prefork-server 工作(但是一个人“Audrey Tang”告诉我 Feersum 这不是一个好主意)

所以 - 谢谢你的回答

0 投票
0 回答
181 浏览

apache2 - Dancer2 - 无法使用 Plack 与 Apache2 一起部署

我正在尝试在 Apache2 上使用 Plack 部署 Dancer2 应用程序。但是在更改端口 80 上的所有配置后 - 它显示的是目录列表而不是应用程序本身

这是我在本地运行的应用程序:

root@dancer-cmuscheduler:/home/ADI/dancer_scheduler# plackup bin/app.psgi HTTP::Server::PSGI: 在 http://0:5000/接受连接

这在端口 5000 上运行得很好。

但是,我想部署在 apache2 上。这是我的配置:

我一直在尝试调试 4 个小时。有趣的是,相关的日志文件中没有有用的日志可以推动我朝着正确的方向前进

[2016 年 7 月 14 日星期四 02:23:14.424149] [mpm_event:notice] [pid 7468:tid 140401436669824] AH00489:Apache/2.4.7 (Ubuntu) 已配置——恢复正常操作 [2016 年 7 月 14 日星期四 02:23:14.424306] [核心:通知] [pid 7468:tid 140401436669824] AH00094:命令行:'/usr/sbin/apache2'

请指教

0 投票
3 回答
587 浏览

apache - 如何在启动时启动 plack 应用程序

有谁知道如何在启动时启动一个 plack 应用程序。

操作系统是 raspbian(覆盆子 pi)。我想我已经以普通用户(pi)的身份运行它。这就是我手动启动它的方式。

我试过添加这样的东西rc.local但没有成功

su pi -c 'cd /path/to/app && plackup -d -p 5000 -r -R ./lib,./t -a ./bin/app.psgi &'

这将反过来被 Apache 使用,如果有任何区别,应用程序是用 dancer2 编写的。

0 投票
2 回答
130 浏览

perl - 当有 `&` 原型时,如何使用 coderefs 而不是文字 subs?

我试图让Router::Resource在函数的参数不是字面匿名 subs 而是前面定义的 coderefs 的情况下工作。我这样做是为了减少代码重复。

这是大纲中的代码,以最小但有效的方式。这行得通。

在将内部 PSGI 代码从文字匿名更改为 coderef 之后,因此:

然后程序将不再编译:

函数原型是GET(&). 当&是第一个位置时,它允许调用者使用缩写语法,有点像用sort { … } @listmap { … }代替sort sub { … }, @list等,请参阅perlsub#Prototypes

An&需要一个匿名子例程,如果作为第一个参数传递,则不需要sub关键字或后续逗号。

当有原型时,如何使用 coderefs 而不是文字 subs?

0 投票
1 回答
321 浏览

perl - 从计划任务运行 perl Plackup 脚本

如何使用任务计划程序或批处理文件在脚本路径之前调用具有前面参数的脚本?plackup E:\Mojolicious_server.pl

所以我有多个 Mojolicious 应用程序。我已经使用 plack 将它们全部捆绑到一个 psgi 服务器中。

我的 plack 脚本看起来像这样......

现在我想在系统启动时将其作为计划任务运行。

要正常运行这个脚本,我会去 cmd pushd c:\strawberry\perl\bin

然后我会运行这个命令

plackup E:/Mojolicious_Server.pl

我的问题似乎是那plackup部分。我尝试添加plackup E:/Mojolicious_Server.pl到参数部分。我还尝试添加plackup到参数部分和E:/Mojolicious_Server.pl开始部分。当然C:\strawberry\perl\bin\perl.exe是程序启动。

一旦我尝试了我能想到的所有变体(包括双引号和单引号的变体),我编写了一个非常简单的批处理文件来运行(即使只是在终端中进行测试)。它看起来像这样。

上面写着“无法打开 perl 脚本”。

我继续尝试使用另一个 perl 脚本执行我的命令的另一条路线......

这至少在任务计划程序中成功完成,但实际上并没有做任何事情......

作为最后的手段(显然行不通),我补充说plackup E:\\Mojolicious_Server.pl;在我的 Mojolicious_Server.pl 脚本的末尾并运行该脚本。没有像我预期的那样工作(调用已经运行的脚本)。

这似乎应该很容易,如果我遗漏了一些简单的东西,我很抱歉。任何正确方向的概念都将不胜感激。

另外,我之所以这样做,是因为我严格使用 Windows 环境。如果有更好的方法,请再次向正确的方向轻推。

0 投票
0 回答
217 浏览

perl - 在后台线程中获取 Plack 会话 ID

对不起,我真的试过了,但我找不到这个简单问题的解决方案。

我需要在 plack 中获取 id session,但不是通过浏览器,我想在主命名空间 perl plack 代码中做内部背景。

这是我的代码:

如果我访问根路径http://192.168.1.1:5000,我会得到:

如果我访问http://192.168.1.1:5000/id

我想从 $global 变量的文件中写入 id 会话:

在目标文件中我什么也没得到,但是如果我将变量更改为此,它可以工作:

也许问题是因为这段文字:

线程池中的线程由系统管理。这些线程不绑定到当前请求。因此,Session 对他们不可用。

资料来源: 我可以在后台线程中访问会话吗?

我的目标只是获取 id 并打开此文件以从后台执行其他操作。我想避免将另一个文件保存到这个简单的任务中,避免使用 sql 等。

因为我已经将数据会话保存在一个文件中:

我感谢任何建议,也许这可以通过另一种方式实现。

非常感谢。

0 投票
1 回答
173 浏览

perl - 理解这个 Plack 实现

我正在研究一个使用 Plack 的 Web 服务的奇怪实现,我不太明白所有部分是如何组合在一起的(一位同事从教程中复制并修改了它,但他再也找不到教程了)。

首先,这段代码确实有效,尽管它很奇怪。

以下是我所知道的:在高层次上,这段代码实现了一个 Web 服务。由于 Plack 的约定,该文件必须返回一个方法,该方法将请求参数作为输入,然后返回 HTTP 代码和正文。这就是为什么会有“我的 $app = sub {”。假设这是文件中的最后一行(即 app.psgi),它将是文件的返回值。

我不明白一些以“return sub”开头的东西。我相信这本质上是覆盖“my $app = sub {”,因为现在这是文件将返回的函数。

然而,这可能是错误的,因为它似乎需要不同的论据。它不采用 $env(这是有关请求的信息,包括 GET 参数),而是采用参数 $responder。当我打印出它的类型时,它是 CODE。我不知道那是什么意思。

然后下一行似乎同时返回一个 HTTP 代码(开始我们的响应)并获得一个写入器来写入额外的数据。之后的一切都是有道理的。

所以总而言之,我需要帮助理解第二种方法在做什么,以及它的论点的性质是什么。首先十分感谢。

0 投票
1 回答
366 浏览

perl - 将自定义环境变量设置为 psgi hash plack

当我向 dumper $env 发出请求时,我得到了环境哈希 psgi 的所有数据,在这个例子中

或更直接地

输出:

返回客户端的 IP 地址

如何将我自己的自定义环境变量设置为 psgi hash plack

为什么我要这样做,我的情况与: Nginx 变量类似于 Apache 中的 SetEnv?

如果不能这样做,我可以创建子类并将该功能添加到 psgi Web 服务器吗?

谢谢你的时间