如何让PHP 5.2(作为apache mod_php运行)向客户端发送完整的HTTP响应,然后继续执行操作一分钟?
长篇故事:
我有一个PHP脚本,必须执行一些长数据库请求并发送电子邮件,运行需要45到60秒.该脚本由我无法控制的应用程序调用.我需要应用程序报告从PHP脚本收到的任何错误消息(主要是无效的参数错误).
应用程序的超时延迟小于45秒(我不知道确切的值)因此将PHP脚本的每次执行都注册为错误.因此,我需要PHP尽可能快地将完整的HTTP响应发送到客户端(理想情况下,只要输入参数已经过验证),然后运行数据库和电子邮件处理.
我正在运行mod_php,所以pcntl_fork
不可用.我可以通过将要处理的数据保存到数据库并运行实际过程来解决这个问题cron
,但我正在寻找一个更短的解决方案.
我经常被告知使用Lazy
OCaml中的模块,可以用惰性语言(如Haskell)完成所有操作.为了测试这个说法,我正在尝试编写一个函数,将常规列表转换为ocaml中的静态双向链表.
type 'a dlist = Dnil | Dnode of 'a dlist * 'a * 'a dlist
Run Code Online (Sandbox Code Playgroud)
鉴于此类型,我可以手动创建几个静态双向链表:
let rec l1 = Dnode (Dnil,1,l2)
and l2 = Dnode (l1,2,l3)
and l3 = Dnode (l2,3,Dnil)
Run Code Online (Sandbox Code Playgroud)
但我想写一个类型的函数'a list -> 'a dlist
,给定任何列表在OCaml中构建一个静态双向链表.例如,[1;2;3]
它应该输出相当于l1
上面的东西.
在Haskell中编写该算法非常简单:
data DList a = Dnil | Dnode (DList a) a (DList a)
toDList :: [a] -> DList a
toDList l = go Dnil l
where
go _ [] = Dnil
go h (x:xs) …
Run Code Online (Sandbox Code Playgroud) 我目前正在深入研究CouchDB,我对视图中Map-Reduce计算的分布感到困惑.我看到很多资源都提到Map-Reduce本身是分布式的,因为你可以在服务器A上处理一半数据,另一半在服务器B上处理,然后减少两个结果.一个例子是本演示文稿的幻灯片16:
http://www.slideshare.net/gabriele.lana/couchdb-vs-mongodb-2982288
这似乎是合乎逻辑的,但是:
CouchDB似乎没有提供用于将计算分派给多个服务器的API.它似乎提供的唯一分发是将整个数据集复制到其他服务器(我假设它会计算自己的视图数据).
CouchDB使用B-Tree来存储基于在视图算法的Map步骤中生成的密钥的视图数据,这排除了基于应该在哪个服务器上对文档进行适当分区.
那么,CouchDB是否会分发Map-Reduce计算?或者Map-Reduce属性仅用于缓存B树节点中的值?
这个jQuery 1.3.2代码为页面添加了一个元素,注册了一个"click"事件,然后删除并重新附加了该元素:
var button = $('<button>Click me!</button>')
.click(function(){ alert("Hello") })
.appendTo('body');
$('body').html('');
button.appendTo('body');
Run Code Online (Sandbox Code Playgroud)
该按钮按预期显示在页面上,但单击它不会执行任何操作.我想知道为什么从对象中删除了事件处理程序.
注:我知道的解决方案,如jQuery.live()
或clone(true)
或使用appendTo
没有去除.我正在寻找的是解释,而不是解决方案或解决方法.
编辑:我想这可能是DOM的任意和反直觉的设计决策.像"因为这是规范Y希望它的X部分的方式"的解释会很好.
现在,当我在PHP网站的页面上发现问题时,我必须查看URL,在心理上推断出负责显示该页面的文件,然后导航Eclipse PDT文件树以打开该文件.这很烦人,并且使用可能已用于解决问题的脑力.
我希望我的PHP网站在每个页面上显示一个链接,我可以单击该链接以自动在Eclipse中打开正确的文件.
我可以轻松计算我需要打开的文件的完整绝对路径(例如,在访问/ foo/bar时打开C:/xampp/htdocs/controllers/Foo/Bar.php),我可以确保Eclipse是目前正在加载正确的项目打开,但我仍然坚持我可以让Firefox/Chrome/IE告诉Eclipse打开该特定文件.
编辑
我正在沿着数据的方式:URI,通过添加包含文件名称的文件的链接,使用不常见的MIME类型.
<a href="data:link/php;base64,IkM6XHhhb[snip]GhwIgo=">
View controller
</a>
Run Code Online (Sandbox Code Playgroud)
base64编码的内容是我计算机上文件的绝对路径.当我点击链接时,Firefox让我将内容类型绑定到一个新的应用程序,所以我选择了一个我自己编写的批处理文件:
for /f "delims=" %%i in (%1) do (
notepad.exe "%%i"
)
Run Code Online (Sandbox Code Playgroud)
这有效.现在,我希望在已打开的Eclipse窗口中打开该文件.notepad.exe
在上面的批次中我需要更换什么?
我目前有两个"层"模块,代表数据库中的标识符 - 数据关系.
所述第一层限定标识符类型,例如IdUser.t
或IdPost.t
,而第二层定义了数据类型,例如User.t
或Post.t
.我需要在第二层的模块之前编译第一层的所有模块,因为Post.t
必须保留IdUser.t
其作者并User.t
保留IdPost.t
他访问的最后五个帖子.
现在,IdUser.t
提供只应该被使用的功能User.t
,例如将变换IdUser.t
为IdUser.current
:的能力.出于安全原因,此变换必须仅由函数执行User.check_password
.由于IdUser
和User
是独立的模块,我需要定义这些功能作为公共职能,依靠约定来避免调用它们以外的任何位置User
,这是相当脏.对称情况发生在IdPost.mine
:
module IdUser : sig
type t
type current
val current_of_t : t -> current (* <--- Should not be public! *)
end = struct
type t = string
type current = string
let current_of_t x = x
end
module IdPost : …
Run Code Online (Sandbox Code Playgroud) 我定义了以下视图:
{ "_id":"_design/test",
"language":"javascript",
"views":
{ "test":
{ "map": "function(doc) { for (var k in doc.data) emit(doc.data[k],null);}",
"options": {"collation":"raw"}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在没有任何参数的情况下查询视图时,我得到了预期的结果(排序为"AB ... ab"而不是"aAbB",因为我指定了原始排序规则):
http://localhost:5985/test/_design/test/_view/test
{"total_rows":13,"offset":0,"rows":[
{"id":"-","key":"A","value":null},
{"id":"-","key":"B","value":null},
{"id":"-","key":"C","value":null},
{"id":"-","key":"D","value":null},
{"id":"-","key":"E","value":null},
{"id":"-","key":"F","value":null},
{"id":"-","key":"a","value":null},
{"id":"-","key":"b","value":null},
{"id":"-","key":"c","value":null},
{"id":"-","key":"d","value":null},
{"id":"-","key":"e","value":null},
{"id":"-","key":"f","value":null},
{"id":"-","key":"g","value":null}
]}
Run Code Online (Sandbox Code Playgroud)
然后我使用startkey
和endkey
索取之间的范围B
和a
,我希望收到钥匙BCDEFa
,而是我收到以下错误信息:
http://localhost:5985/test/_design/test/_view/test?startkey=%22B%22&endkey=%22a%22
{ "error": "query_parse_error",
"reason": "No rows can match your key range, reverse your start_key and
end_key or set descending=true"
}
Run Code Online (Sandbox Code Playgroud)
当行B,C,D,E,F和a匹配时,为什么没有行可以匹配键范围?
编辑:我有一个文件(版本和ID省略):
{ "_id": "-",
"_rev": "-", …
Run Code Online (Sandbox Code Playgroud) 我偶然发现了一个相当简单的OCaml问题,但我似乎无法找到一个优雅的解决方案.我正在使用应用于相对简单模块的函子(它们通常在该类型上定义类型和一些函数),并通过添加更复杂的函数,类型和模块来扩展这些简单模块.简化版本将是:
module type SIMPLE = sig
type t
val to_string : t -> string
val of_string : string -> t
end
module Complex = functor (S:SIMPLE) -> struct
include S
let write db id t = db # write id (S.to_string t)
let read db id = db # read id |> BatOption.map S.of_string
end
Run Code Online (Sandbox Code Playgroud)
没有必要给简单模块命名,因为它的所有功能都存在于扩展模块中,而简单模块中的函数是由camlp4根据类型生成的.这些仿函数的惯用用法是:
module Int = Complex(struct
type t = int
end)
Run Code Online (Sandbox Code Playgroud)
我在处理记录时出现问题:
module Point2D = Complex(struct
type t = { x : int ; …
Run Code Online (Sandbox Code Playgroud) 现在,我有一个用OCaml编写的工作HTML模板系统.一般设计是单个模板是应用于以下模块类型的仿函数返回的模块:
module type TEMPLATE_DEF = sig
type t (* The type of the data rendered by the template. *)
val source : string (* Where the HTML template itself resides. *)
val mapping : (string * (t -> string)) list
end
Run Code Online (Sandbox Code Playgroud)
例如,呈现博客帖子将基于此:
module Post = Loader.Html(struct
type t = < body : string ; title : string >
let source = ...
let mapping = [ "body", (fun x -> x#body) ; "title", (fun x -> x#title) ]
end)
Run Code Online (Sandbox Code Playgroud)
仅具有 …
在我的代码中,我有一个数据库访问上下文,提供基本的读/写操作,称为CouchDB.ctx
.我的应用程序中的各种模块然后使用其他功能扩展该类,例如Async.ctx
.
我正在实现一个Cache
包裹Source
模块的模块.该Cache
模块的功能需要上下文参数和操作数据库.然后,一些调用Source
与上下文一起转发到模块.
我需要按照以下方式定义一个仿函数:
module CouchDB = struct
class ctx = object
method get : string -> string option monad
method put : string -> string -> unit monad
end
end
module AsyncDB = struct
class ctx = object
inherit CouchDB.ctx
method delay : 'a. float -> (ctx -> 'a monad) -> 'a monad
end
end
module type SOURCE = sig
class ctx = #CouchDB.ctx (* <-- …
Run Code Online (Sandbox Code Playgroud)