2

我有一个 php 脚本,它获取用户输入(一些文本和一个链接),将其放入数据库中,然后使用用户提供的链接搜索图像。

问题是,有时搜索图片需要一段时间,这会使网站“卡住”,因此显示“您的帖子已提交!”的视图 有时需要 4 到 6 秒才能最终加载。

有没有办法让 PHP 异步搜索图像?

您可能想知道我为什么不直接加载视图然后进行图像搜索,或者只使用 AJAX。好吧,我需要数据库中的“最后插入 ID”来根据项目 ID 重命名图像,这只能在帖子插入数据库后完成。

编辑 1:我已经阅读了这个异步 PHP 调用?但我不确定我是否理解。

编辑 2:这是所要求的过程概述:

  • 第 1 步:用户打开表单并填写 2 个字段(一些文本和一个链接)
  • 第 2 步:用户提交表单
  • 第 3 步:PHP 在 MySQL 数据库中插入帖子
  • 第 4 步:PHP 搜索该链接的图像(爬网,需要几秒钟)并使用数据库插入的最后一个 ID 的名称保存图像。如果最后一个 ID 为 75,图像将保存为“img_75”。
  • 第 5 步:PHP 加载“您已成功发布链接”

我想要的是step 5 在 step 3 之后发生,而 step 4 正在运行。我实际上并不需要第 4 步的响应。只要它在后台运行我很高兴 :)


解决方案:我已经按照@shadyyx 的建议做了。一个简单的 AJAX 调用。我真的希望有一个替代方案,但显然 php 或任何其他服务器端语言都不能处理异步调用。

4

5 回答 5

4

我将在两步 AJAX 调用中执行此操作。

这是它的样子:

  1. 用户打开表单并填写数据
  2. 用户单击提交按钮 - AJAX 调用被发送到服务器
  3. 一个新条目被写入数据库,最后一个 ID 作为响应返回给 JS
  4. 您向用户显示表单已提交的消息
  5. 并调用新的 AJAX 请求,该请求将抓取所需的 URL,下载并使用您从第一个 AJAX 响应中获得的 ID 保存图像......

清除?简单的?我猜是...

于 2012-05-22T13:46:54.250 回答
1

我为此使用了流程。

  1. 客户请求
  2. 服务器回答并给客户端一个回答 ID
  3. 服务器启动一个 php 进程,该进程在后台执行长时间运行的操作并将结果保存到文件中
  4. 客户端每隔几秒就用 ID 请求答案
  5. 当所有内容都在文件中时,服务器加载它并在服务器的应答请求中发送结果。

为此使用了 popen() ...

服务器也可以告诉客户端一个时间跨度,客户端应该等待直到请求答案。

于 2012-05-22T13:20:08.140 回答
1

为什么不创建一条新记录,立即返回最后一个 id,然后运行新查询以使用信息更新记录?

于 2012-05-22T13:27:31.693 回答
1

以下是我对您的情况的建议:

  • 当您加载表单页面时,向浏览器发送一个 cookie。
  • 对图像的请求不应该(也不应该)依赖于“将要”插入的记录。
  • 您正在搜索的图像将保存在某个临时路径中。将该路径与 cookie 关联。在 PHP 中,您可以使用$_SESSION[...]. 一旦用户填写了必填字段,这将是一个 AJAX 请求。
  • 当表单提交到服务器时:
  • 服务器从 $_SESSION 变量中获取图像。
  • PHP 将文件从临时位置移动到实际位置。
  • 更新数据库。

为什么不应该过早地创建记录

当 AJAX 请求到达服务器(并创建记录)然后用户导航离开时会发生什么?在这种情况下,您需要有额外的构造来删除该记录,这是您不想进入的某种额外内容。

于 2012-05-22T13:40:56.337 回答
0

我已经阅读了这个异步 PHP 调用?

那里的答案质量可能会更好。

但我不确定我是否理解

err,那么你可能不明白这里的答案。

简短的回答是您不能编写异步 PHP 代码。

一个更长的答案是您可以使用 curl_multi_ 函数从 PHP 发出并行 HTTP 请求(但仍然阻塞),但是如果您想从 PHP 生成页面而不阻塞,那么您必须生成包含 AJAX 调用的 HTML 并让浏览器处理并发请求并在完成后将它们填充到页面中。使用这种方法,您可以选择在 DBMS 上调用多个搜索线程(如果操作正确)应该比单个请求运行得更快。

于 2012-05-22T14:36:13.240 回答