我的印象是 DART 程序不能托管在网络服务器中。有人可以请教我吗?
5 回答
是的,它可以(尽管这不是它的主要用例)。
来自Google Plus,2013 年 2 月 28 日:
最后我设法让 Dart 在 Apache CGI 中工作!我没有找到任何有关此的信息,所以我自己尝试了。这是我的做法(Apache 2.2 和 Ubuntu)...
来自news.dartlang.org,2012 年 5 月 26 日
今天,Sam McCall 宣布了 mod_dart:运行嵌入在 Apache 中的 Dart 应用程序的能力!就像 PHP、Perl、Python 和许多其他脚本语言一样,您现在可以使用 Dart 从 Apache Web 服务器内部为您的服务器端 Web 应用程序提供动力。
这两个都是“概念证明”,但它们表明 Dart 可以嵌入到 Apache 等 Web 服务器中。
现在的“但是……”
尽管已经证明 Dart 可以嵌入到 Web 服务器中,但 Dart 更像 node.js,因为服务器端 dart 二进制文件提供了一个 VM 供应用程序使用。该应用程序可以包括它自己的网络服务器,例如:
main() {
var server = new HttpServer();
server.addRequestHandler(
(req) => true, // matcher - should this function handle this request?
(req, res) { // handler - what should happen when this request matches?
res.outputStream.write("${req.method}: ${req.path}"); // eg: GET: /foo
res.outputStream.close();
});
server.listen('127.0.0.1', 8080);
Dartlang 2.3 中的示例 Apache CGI:
将“dartaotruntime”复制到“/var/www/your-site/cgi-bin”
$ chown apache:apache dartaotruntime
创建文件 test.cgi
#!/bin/sh
BASE=/var/www/your-site/cgi-bin
$BASE/dartaotruntime $BASE/test.aot
$ chmod 0755 test.cgi
$ chown apache:apache test.cgi
创建文件 test.dart
import 'dart:io';
void main(List<String> args) {
Map<String, String> envVars = Platform.environment;
print("Content-Type: text/html\n");
String input = "";
if (envVars['REQUEST_METHOD'] == 'POST') {
var content_length = int.parse(envVars['CONTENT_LENGTH']);
while(input.length < content_length) {
input += stdin.readLineSync();
}
}
print("""
<html>
<form method="post" action="test.cgi">
Name: <input type="text" name="name" value="" />
Email: <input type="text" name="email" value="" />
<input type="submit" value="Submit" />
</form>
<p><strong>ENV:</strong> {$envVars}</p>
<p><strong>INPUT:</strong> {$input}</p>
</html>""");
}
$ dart2aot test.dart test.aot
$ chown apache:apache test.aot
运行 cgi: https: //www.your-site.com/cgi-bin/test.cgi
您可以使用 cgi-bin apache 环境像 perl 脚本一样运行 dart。我在我的 Mac 上使用 XAMPP 对其进行了测试,它可以工作:
#!/usr/local/bin/dart
import 'dart:io';
void main() {
Map<String, String> envVars = Platform.environment;
print("Content-Type: text/html\n");
String input = "";
if (envVars['REQUEST_METHOD'] == 'POST') {
var content_length = int.parse(envVars['CONTENT_LENGTH']);
while(input.length < content_length) {
input += stdin.readLineSync();
}
}
print("""
<html>
<form method="post">
Name: <input type="text" name="name" value="" />
Email: <input type="text" name="email" value="" />
<input type="submit" value="Submit" />
</form>
<p><strong>QUERY_STRING:</strong> ${envVars['QUERY_STRING']}</p>
<p><strong>ENV:</strong> {$envVars}</p>
<p><strong>INPUT:</strong> {$input}</p>
</html>
"""
);
}
最初,error_log 中出现了一些错误,xampp 库无法正常工作。我只需从日志中指示的位置复制到xampp的lib目录即可正常工作。
==> /Applications/XAMPP/xamppfiles/logs/error_log <== [Sun Feb 23 14:08:12.799968 2020] [cgi:error] [pid 91112] [client 127.0.0.1:64109] AH01215: dyld: Symbol not找到:_sqlite3_bind_blob64:/Applications/XAMPP/xamppfiles/cgi-bin/dart.dart
[Sun Feb 23 14:08:12.800332 2020] [cgi:error] [pid 91112] [client 127.0.0.1:64109] AH01215:引用自:/System/Library/PrivateFrameworks/BaseBoard.framework/Versions/A/BaseBoard: /Applications/XAMPP/xamppfiles/cgi-bin/dart.dart
[Sun Feb 23 14:08:12.800432 2020] [cgi:error] [pid 91112] [client 127.0.0.1:64109] AH01215:预计在:/Applications/XAMPP/xamppfiles/lib/libsqlite3.dylib:/Applications/XAMPP /xamppfiles/cgi-bin/dart.dart
[Sun Feb 23 14:08:12.800529 2020] [cgi:error] [pid 91112] [client 127.0.0.1:64109] AH01215: 在 /System/Library/PrivateFrameworks/BaseBoard.framework/Versions/A/BaseBoard: /Applications /XAMPP/xamppfiles/cgi-bin/dart.dart
[Sun Feb 23 14:08:12.800581 2020] [cgi:error] [pid 91112] [client 127.0.0.1:64109] 标头之前的脚本输出结束:dart.dart
我使用这些命令来更新库:
ln -s `which dart` /usr/local/bin/dart
sudo cp /System/Library/Frameworks/ImageIO.framework//Versions/A/Resources/libJPEG.dylib /Applications/XAMPP/xamppfiles/lib/libJPEG.dylib
sudo cp /System/Library/Frameworks/ImageIO.framework//Versions/A/Resources/libTIFF.dylib /Applications/XAMPP/xamppfiles/lib/
sudo cp /System/Library/Frameworks/ImageIO.framework//Versions/A/Resources/libPng.dylib /Applications/XAMPP/xamppfiles/lib/
sudo cp /usr/lib/libsqlite3.dylib /Applications/XAMPP/xamppfiles/lib/
使用 QueryString 和 Post 查看结果:
不要忘记在脚本的第一行设置 dart 可执行文件的正确路径。我通常将它链接到 /usr/local/bin
mod-dart 的开发已经停滞了 2 年。
只是想补充一点,这些天 - 与过时的原始答案相反 - 服务器端飞镖绝对是一回事。这样做的方法是使用Alfred之类的东西运行 dart 服务器端应用程序,然后使用反向代理传递数据,这样你就可以使用 Lets Encrypt 的 SSL。我个人使用 Nginx 遵循这样的指南: https ://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-ubuntu -16-04
为我的 dart 应用替换 nodejs。