相关疑难解决方法(0)

1126
推荐指数
17
解决办法
84万
查看次数

如何在PHP中创建异步GET请求?

我希望对另一台服务器上的另一个脚本发出一个简单的GET请求.我该怎么做呢?

在一种情况下,我只需要请求外部脚本而无需任何输出.

make_request('http://www.externalsite.com/script1.php?variable=45'); //example usage
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,我需要获取文本输出.

$output = make_request('http://www.externalsite.com/script2.php?variable=45');
echo $output; //string output
Run Code Online (Sandbox Code Playgroud)

说实话,我不想乱用CURL,因为这不是CURL的工作.我也不想使用http_get,因为我没有PECL扩展.

fsockopen会工作吗?如果是这样,如何在不读取文件内容的情况下执行此操作?没有其他办法吗?

谢谢大家

更新

我应该补充一下,在第一种情况下,我不想等待脚本返回任何内容.据我所知,file_get_contents()会等待页面完全加载等?

php curl asynchronous http

94
推荐指数
6
解决办法
11万
查看次数

发送HTTP响应后继续执行PHP

如何让PHP 5.2(作为apache mod_php运行)向客户端发送完整的HTTP响应,然后继续执行操作一分钟?

长篇故事:

我有一个PHP脚本,必须执行一些长数据库请求并发送电子邮件,运行需要45到60秒.该脚本由我无法控制的应用程序调用.我需要应用程序报告从PHP脚本收到的任何错误消息(主要是无效的参数错误).

应用程序的超时延迟小于45秒(我不知道确切的值)因此将PHP脚本的每次执行都注册为错误.因此,我需要PHP尽可能快地将完整的HTTP响应发送到客户端(理想情况下,只要输入参数已经过验证),然后运行数据库和电子邮件处理.

我正在运行mod_php,所以pcntl_fork不可用.我可以通过将要处理的数据保存到数据库并运行实际过程来解决这个问题cron,但我正在寻找一个更短的解决方案.

php fork

62
推荐指数
6
解决办法
4万
查看次数

使用PHP Curl库的持久/ keepalive HTTP?

我正在使用一个简单的PHP库通过HTTP将文档添加到SOLR索引.

目前涉及3台服务器:

  1. 运行索引作业的PHP框
  2. 一个数据库框,其中包含要编制索引的数据
  3. solr盒子.

在80个文档/秒(100万个文档中),我注意到PHP和solr盒子上的网络接口上的异常高的中断率(2000 /秒;更重要的是,图表几乎相同 - 当中断时PHP盒子峰值的速率,它也在Solr盒子上激增),但在数据库盒子上却少得多(300 /秒).我想这只是因为我打开并重用了一个到数据库服务器的连接,但是每个Solr请求当前都是通过cURL打开一个新的HTTP连接,这要归功于Solr客户端库的编写方式.

所以,我的问题是:

  1. cURL可以打开一个keepalive会话吗?
  2. 重用连接需要什么? - 它是否像重用cURL句柄资源一样简单?
  3. 我是否需要设置任何特殊的cURL选项?(例如强制HTTP 1.1?)
  4. 有没有关于cURL keepalive连接的陷阱?这个脚本一次运行几个小时; 我可以使用单个连接,还是需要定期重新连接?

php curl http libcurl keep-alive

59
推荐指数
3
解决办法
7万
查看次数

从PHP发送HTTP请求而不等待响应?

我希望从PHP发送HTTP GET请求.例:

http://tracker.example.com?product_number=5230&price=123.52
Run Code Online (Sandbox Code Playgroud)

我们的想法是进行服务器端网络分析:服务器不是将跟踪信息从JavaScript发送到服务器,而是将跟踪信息直接发送到另一台服务器.

要求:

  • 请求应该花费尽可能少的时间,以便不会明显延迟PHP页面的处理.

  • tracker.example.com不需要检查来自的响应.作为示例,一些可能的响应来自 tracker.example.com:

    • 200:没关系,但不需要检查.

    • 404:运气不好,但是 - 再次 - 不需要检查.

    • 301:虽然重定向是合适的,但它会延迟PHP页面的处理,所以不要这样做.

    简而言之:可以丢弃所有回复.

解决方案的想法:

  • 在一个现在删除的答案中,有人建议在shell进程中从PHP 调用命令行 curl.这似乎是一个好主意,只是我不知道在重负载下分配大量shell进程是否明智.

  • 我找到了php-ga,一个用于从PHP进行服务器端Google Analytics的软件包.在项目的页面上,提到:"可以配置为使用非阻塞请求." 到目前为止,我还没有时间研究php-ga内部使用的方法,但这种方法可能就是这样!

简而言之:从PHP进行通用服务器端跟踪/分析的最佳解决方案是什么.

php curl http server-side web-analytics

40
推荐指数
4
解决办法
4万
查看次数

Yii框架中的PHP异步方法调用

我想知道是否有可能在操作呈现视图时从其中一个操作异步调用Yii控制器方法,让方法完成长时间运行的操作.我很乐意做类似下面的代码,我不需要返回结果my_long_running_func.

public function actionCreate() {
    $model = new Vacancies;
    if (isset($_POST['Vacancies'])) {
        $model->setAttributes($_POST['Vacancies']);
        $model->save();
        //I wish :)
        call_user_func_async('my_long_running_func',$model);
    }
    $this->render('create', array( 'model' => $model));
}
Run Code Online (Sandbox Code Playgroud)

问题

我试图在Yii写一个控制器动作,发布空缺并通知感兴趣的订阅者.问题是执行通知查询需要很长时间.

现在我正在寻找一种异步运行查询的方法,以便海报在尽可能短的时间内查看他的响应,而查询在后台以类似于C#委托或事件的方式运行.

我GOOGLE了解决方案进行异步请求(一个或多个)控制器动作的过程中,但所有我想做的是异步运行控制器的方法和行动不得不等待,直到请求(S)已经完成.

尝试

我尝试了以下方法,但对于大约1500个用户的测试数据,查询仍然很慢.

  • Yii ActiveRecord

    if ($vacancy->save()) {                
        if($vacancy->is_active == 1) {
            $url = Yii::app()->createUrl('vacancies/view',array('id'=>$model->id));
            $trainees = YumUser::getUsersByRole('Trainees');
            if($trainees!=null) {
                foreach($trainees as $trainee){
                    $message = new YumMessage;
                    $message->from_user_id = Yii::app()->user->id;
                    $message->title = 'Vacancy Notification: '.date('M j, Y');
                    $message->message = "A new vacancy has …
    Run Code Online (Sandbox Code Playgroud)

php mysql events asynchronous yii

10
推荐指数
1
解决办法
4267
查看次数

卷曲超时小于1000毫秒总是失败?

此代码始终失败(即$result布尔值false):

     $ch = curl_init();
     curl_setopt($ch, CURLOPT_URL, $path);
     curl_setopt($ch, CURLOPT_HEADER, TRUE);
     curl_setopt($ch, CURLOPT_NOBODY, TRUE);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
     $curl_version = curl_version();

     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 999);

     $result = curl_exec($ch);
     curl_close($ch);
Run Code Online (Sandbox Code Playgroud)

此代码始终成功(即,$result是包含标头的字符串):

     $ch = curl_init();
     curl_setopt($ch, CURLOPT_URL, $path);
     curl_setopt($ch, CURLOPT_HEADER, TRUE);
     curl_setopt($ch, CURLOPT_NOBODY, TRUE);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
     $curl_version = curl_version();

     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 1000);

     $result = curl_exec($ch);
     curl_close($ch);
Run Code Online (Sandbox Code Playgroud)

唯一的区别是我将超时从999ms更改为1000ms.

这必须是卷曲中的错误或者我错过的连接超时文档中的某种最小值.这是什么?我的钱是后者.

php curl connection-timeout

9
推荐指数
1
解决办法
7159
查看次数

如何保护OpenID消费者免遭滥用?

我正在考虑将OpenID作为我的PHP应用程序的登录方法,但是有一件事阻止我继续:我如何保护OpenID消费者免受滥用?

使用使用者作为代理滥用OpenID的示例

滥用包括将其他服务器充满请求,使用我的应用程序作为代理,将大量下载作为URL传递或通过执行大量请求不必要地降低服务器速度.

我想我应该在做请求时实施限速,但我该怎么办呢?可能的攻击者可以使用其他代理或TOR来绕过IP检查.限制允许的提供程序会违反OpenID的原则吗?

我不希望我的用户是邪恶的,但我想知道在添加另一个可能的攻击向量之前我需要考虑哪些事情.

如果重要的是,我将使用lightopenid作为PHP应用程序的后端.

openid denial-of-service

8
推荐指数
1
解决办法
409
查看次数

同时多个php请求,第二个请求直到第一次完成才开始

我有一个长期运行的 php 7.2 脚本,它正在生成一个 zip 文件。我想使用循环 ajax 调用来检查构建 zip 文件的进度。第二个脚本似乎被锁定,并且在第一个脚本完成之前不会开始处理。

事实上,在第一个脚本完全完成之前,第二个脚本甚至不会在我的 index.php 路由脚本的第 1 行打印 error_log() 。

我的index.php路由器脚本的顶部:

<?
error_log('top of index '.$_SERVER['REQUEST_URI']);
Run Code Online (Sandbox Code Playgroud)

即使我只是请求静态图像资源也是如此。在长时间运行的脚本完全完成之前,第 1 行的 error_log() 甚至不会打印。

起初,我相信我遇到了此处描述的会话锁定,但他们提供的解决方案似乎不起作用(调用session_write_close()),我想知道是否还有其他事情发生,因为第二个脚本在第 1 行之前锁定为反对在我尝试开始会话时锁定。第二个脚本似乎根本没有开始。我想也许服务器在第 1 行之前自动启动了会话,但我检查了一下,我的服务器有 session.auto_start=0。

我需要设置一些服务器配置吗?

我错过了什么?我究竟做错了什么?

我使用内置的 PHP 服务器在本地主机(Mac)上运行它。

php -c /usr/local/etc/php/7.2/php.ini -S 127.0.0.1:8080 index.php
Run Code Online (Sandbox Code Playgroud)

php session php-7.2

7
推荐指数
1
解决办法
995
查看次数

非阻塞函数PHP

我有一个项目,用户通过表单上传图像,服务器做一些缩略图.缩略图制作过程非常慢,所以我认为使用非阻塞功能进行图像大小调整可能是一个很好的解决方案.我的意思是:服务器处理表单(具有更多字段)向用户提供"ok"反馈,然后调用缩略图功能.我怎样才能做到这一点?

提前致谢

php

6
推荐指数
2
解决办法
7218
查看次数

php请求网址,无需等待响应

我正在尝试在不等待内容的情况下执行file_get_content BUT的变体.基本上我在不同的URL请求另一个PHP脚本,它将下载一个大文件,所以我不想等待文件完成加载.任何人有任何想法?

谢谢!

php

5
推荐指数
1
解决办法
1万
查看次数

PHP请求"在后台"

有没有办法在用户不必等待响应的情况下发出PHP请求?某种"背景中的php请求"?

例如,如果应用程序需要发送100封电子邮件,因为用户提交了某些内容,我不想为此用户显示"发送...请等待",但我希望其他一些脚本可以独立于该用户执行此操作...

php background request

2
推荐指数
1
解决办法
2020
查看次数

SendGrid for PHP很慢.非阻塞请求是否可行?

我们目前正在开发适用于iOS和Android的移动应用.为此,我们需要一个稳定的Web服务.

要求: - 基于PHP和MySQL,必须快速,必须可扩展

我创建了一个带有多个端点的自定义编码简单Web服务,允许将数据从应用程序传递到我们的数据库,反之亦然.

我的问题:

对于正常请求(例如,更新数据库字段或执行INSERT INTO),我的自定义编码解决方案的平均响应时间低于100毫秒(使用newrelic测量).然而,这没有任何负载(每天低于100个用户).当我们创建出站请求(特别是使用SendGrid PHP-Framework发送电子邮件)时,我们看到的响应时间大于1000毫秒.似乎请求正在"等待"来自Sendgrid的响应.是否有可能告诉脚本不要"等待回复"?这不是很理想.我的想法是将所有"挂起"请求存储到一个单独的表中,然后使用cron运行所有"挂起"请求并将它们标记为"已完成".这是一个可行的解决方案?并且每分钟一个cron是否足以处理请求(每个电子邮件可能延迟1分钟)?

与往常一样,任何回复或建议都非常感谢.提前致谢!

php mysql sendgrid

1
推荐指数
1
解决办法
1210
查看次数