我正试图进入网络推送技术,所以我开始环顾四周.我基本上找到了2种技术,即Websockets和SSE.由于缺乏perl支持而排除Websockets后,我想尝试更原生的SSE方法.
现在,试图让SSE工作是一个真正的痛苦.每个文档都有相互矛盾的信息,似乎没有就SSE如何工作达成一致意见.有人说你需要一个<event-listen src="events.pm">
标签,其他人说你只需要一个EventSource
JS对象.即使使用EventSource对象,我发现了大约4种可能的实现,但它们似乎都不起作用.
这就是我所拥有的.我有一个events.pm
,使用mod-perl.如果您调用该文件,则返回data: I haz a websocket
.这是与内容类型一起发送的application/x-dom-event-stream
.
HTML和JS文件经常被重写,我已经放弃了不同的实现.你们能告诉我一个有效的例子吗?
另外:我不明白你如何向客户发送特定的消息.发送预定义的消息似乎没问题.但是,如果我想象某人向我发送消息的情况,我不明白这些信息("有一条新消息给你")是如何传输到需要该信息的确切浏览器的.我发现的每篇文章都充其量是模糊的.
基本上,我需要的是一种方式来说'嘿,你被允许得到这个通知吗?首先告诉我你的身份/会话/令牌!' 在每个连接的客户端.我想知道SSE是否可能.
我有以下场景.
我向用户显示服务器的一些音频文件.用户单击一个,然后最终使用所选文件夹和文件执行onFileSelected.该函数的作用是更改嵌入对象的源.所以在某种程度上,它是在接受它之前预览所选文件并保存用户的选择.视觉辅助.
HTML
<embed src="/resources/audio/_webbook_0001/embed_test.mp3" type="audio/mpeg" id="audio_file">
Run Code Online (Sandbox Code Playgroud)
JavaScript的
function onFileSelected(file, directory) {
jQuery('embed#audio_file').attr('src', '/resources/audio/'+directory+'/'+file);
};
Run Code Online (Sandbox Code Playgroud)
现在,这在Firefox中运行良好,但Safari和Chrome只是拒绝更改源,无论操作系统如何.
jQuery找到对象(jQuery.size()返回1),它执行代码,但HTML代码没有变化.
为什么Safari阻止我更改<embed>
源代码,我该如何规避这个?
我从一个人那里继承了一些代码,他们最喜欢的时间是将每一行缩短到绝对最小值(有时只是为了让它看起来很酷).他的代码很难理解,但我设法理解(并重写)其中的大部分内容.
现在我偶然发现了一段代码,无论我怎么努力,我都无法理解.
my @heads = grep {s/\.txt$//} OSA::Fast::IO::Ls->ls($SysKey,'fo','osr/tiparlo',qr{^\d+\.txt$}) || ();
my @selected_heads = ();
for my $i (0..1) {
$selected_heads[$i] = int rand scalar @heads;
for my $j (0..@heads-1) {
last if (!grep $j eq $_, @selected_heads[0..$i-1]);
$selected_heads[$i] = ($selected_heads[$i] + 1) % @heads; #WTF?
}
my $head_nr = sprintf "%04d", $i;
OSA::Fast::IO::Cp->cp($SysKey,'',"osr/tiparlo/$heads[$selected_heads[$i]].txt","$recdir/heads/$head_nr.txt");
OSA::Fast::IO::Cp->cp($SysKey,'',"osr/tiparlo/$heads[$selected_heads[$i]].cache","$recdir/heads/$head_nr.cache");
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,这应该是某种随机函数,但我从未见过更复杂的方法来实现随机性.或者我的假设是错误的?至少,这就是这段代码应该做的事情.选择2个随机文件并复制它们.
===注意===
OSA框架是我们自己的框架.它们以UNIX对应方式命名,并进行一些基本测试,以便应用程序不需要为此烦恼.
我正在努力确保我的会议安全.在进行一些研究时,我估计基于Agent和IP的PHP的PHPSESSID +随机哈希足以防止劫持.你能做什么呢,真的.
我正在使用HTTPS进行登录.据我所知,来自PHP的会话数据永远不会发送给用户,而是存储在服务器端.客户端仅获取会话的ID.会话数据保存实际的webapp用户会话,而后者又用于检查登录是否有效.一切都很好,花花公子.
但是,有一个我在任何地方都找不到的细节.我想知道如果我使用HTTPS,包含PHP会话ID的cookie是否会自动标记为安全.我做了一些谷歌搜索,但似乎从来没有得到正确的搜索字符串,因为我只找到手动发送cookie的方法.我想知道,因为如果该cookie被发送为明文,它将通过中间人来破坏一些安全性.
这是@ircmaxell的补充
我尝试了你的方法,但当我从HTTPS切换回HTTP时,我仍然得到了cookie.它的工作方式如下.只要服务器知道用户会话可用,它就会设置安全标志.这意味着整个站点在您登录后立即在SSL上运行,并且在您不使用SSL时拒绝放弃/使用cookie.或者至少,这就是想法.
if ($SysKey['user']['session_id'] != '') {
session_set_cookie_params(60*60*24*7, '/', $SysKey['server']['site'], true, true);
}
Run Code Online (Sandbox Code Playgroud)
我假设我需要重新生成id,因为浏览器在登录前已经有了cookie,但由于我只能在几个小时内试用它,我会在尝试之前尝试
我刚刚发现你必须在开始会话之前设置这些设置.那是我的问题.我现在使用2个不同的cookie.一个用于通过http发送的常规访客,另一个用于仅通过ssl发送的登录用户.
Perl的:
$string =~ s/[áàâã]/a/gi; #This line always prepends an "a"
$string =~ s/[éèêë]/e/gi;
$string =~ s/[úùûü]/u/gi;
Run Code Online (Sandbox Code Playgroud)
这个正则表达式应该将"été"转换为"ete".相反,它将它转换为"aetae".换句话说,它为每个匹配元素添加"a".甚至"à"也会转换为"aa".
如果我将第一行更改为此
$string =~ s/(á|à|â|ã)/a/gi;
Run Code Online (Sandbox Code Playgroud)
它有效,但是......现在它预先设置了e
每个匹配的元素(比如"eetee").
即使我找到了合适的解决方案,为什么它会这样做?
我添加了"use utf8;",但它没有改变行为(尽管它在JavaScript/AJAX中打破了我的输出).
Stream源自jQuery执行的Ajax请求.它起源的网站设置为UTF-8.
我正在使用Perl v5.10(perl -v
返回"这是perl,为i586-linux-thread-multi构建的v5.10.0").
在开始之前,我想强调一下我正在使用的结构.
<meta content="text/html;charset=utf-8" http-equiv="content-type"/>
.因此它是utf-8Content-Type: application/x-www-form-urlencoded; charset=UTF-8
这些是症状.我尝试了谷歌告诉我的一切,但我仍然遇到了问题.有没有人知道它可能是什么?如果您需要任何特定的代码段,请告诉我,我会尝试粘贴它.
来自AJAX处理程序的响应标头
Date: Mon, 09 Nov 2009 11:40:27 GMT
Server: Apache/2.2.10 (Linux/SUSE)
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset="utf-8"
200 OK
Run Code Online (Sandbox Code Playgroud)
在你们和这个页面的帮助下,我能够找到问题所在.似乎问题不是编码本身,而是Perl将我的变量$ text编码为utf-8两次(根据网站).解决方案就像添加Encode :: decode_utf8()一样简单.
我一直在寻找完全错误的地方.我感谢所有帮助我在正确的地方搜索的人:)
#spreads一些upvote love#
我正在清理生产版本的Perl代码,并在Apache错误日志中遇到了一个奇怪的警告.
它说:
[Thu Nov 5 15:19:02 2009] Clouds.pm: Use of uninitialized value $name in substitution (s///) at /home/mike/workspace/olefa/mod-bin/OSA/Clouds.pm line 404.
相关代码在这里:
my $name = shift @_;
my $name_options = shift @_;
$name_options = $name_options eq 'unique' ? 'u'
: $name_options eq 'overwrite' ? 'o'
: $name_options eq 'enumerate' ? 'e'
: $name_options =~ m/^(?:u|o|e)$/ ? $name_options
: q();
if ($name_options ne 'e') {
$name =~ s/ /_/g;
}
Run Code Online (Sandbox Code Playgroud)
那么,为什么未初始化变量的警告明显初始化?
我们公司希望将我们托管的所有网站从Latin-1转换为UTF-8.经过谷歌搜索后,我们的Perl脚本几乎完成了.现在唯一缺少的是XML文件.
将XML从Latin-1转换为UTF-8的最佳方法是什么?它有用吗?
我问,因为我们不确定它,因为谷歌的大多数条目都解释了如何做到完全相反.有人甚至说utf8可能会导致XML出现问题.你能介绍一下整个XML编码问题吗?
我有以下代码:
$username = 'username';
$password = 'password';
$host = 'localhost';
$db = 'dbname';
$dbh = new mysqli('p:'.$host, $username, $password, $db)
or die('no connection to server');
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误
PHP Warning: mysqli::mysqli() [<a href='function.mysqli-mysqli'>function.mysqli-mysqli</a>]: (HY000/2005): Unknown MySQL server host 'p:localhost' (1) in /var/www/vhosts/politiker.lu/httpdocs/includes/sql.php on line 8
Run Code Online (Sandbox Code Playgroud)
这引起了我的兴趣,因为完全相同的代码适用于我的开发环境.既然我想在我的生产服务器上设置它,它就不起作用了.有任何想法吗?
注意:我对服务器不是很好,所以请原谅我,如果错误应该是微不足道的.
以下是版本:开发PHP(5.3.3-1ubuntu9.1)+ MySQL(5.1.49-1ubuntu8.1)
生产PHP(5.2.4-2ubuntu5.12)+ MySQL(5.0.51a)