2011-03-23 127 views
22

我需要实现一种方法来POST调用位于同一台服务器或另一台服务器上的页面。我们不能使用包含,因为我们调用的文件通常会调用不同的数据库或具有相同名称的函数。我可以对同一台服务器执行CURL请求吗?

我一直在努力实现这个使用卷曲,而它从另一个服务器调用文件时完美的作品,我让到该文件是在同一台服务器呼叫时获得绝对没有。

编辑添加一些代码: 的我在做什么的简化版本:

File1.php

<?php 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "www.myserver.com/File2.php"); 
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
$result = curl_exec($ch); 
curl_close($ch); 
echo $result; 
?> 

File2.php

<?php 
echo "I'M IN!!"; 
?> 

调用File1.php后,我什么也没得到,但是如果File2.php在另一台服务器上,那么我会得到一个结果。 有什么帮助吗?

我尝试使用在服务器URL(HTTP ...)和文件的总地址(/家/ WWWW ....)

+0

不固定在一些哈克解决方法 – 2011-03-23 21:55:38

+0

真正的问题是粘性可以正常申请,但不更改URL作为本地文件。使用网址作为远程服务器,例如:http://site.com ..我可以看到你的代码吗? – 2011-03-23 21:56:06

+0

而不是像“http://mysite.com”使用完整的地址,使用“本地主机”。它在我的情况下工作。 – MKatleast3 2012-07-19 09:15:17

回答

44

要知道,如果你发出卷曲请求你自己的网站,你正在使用默认的会话处理程序,并且你通过CURL请求的页面使用与产生请求的页面相同的会话,你将遇到死锁情况。

默认的会话处理程序锁定的页面请求期间的会议文件。当您尝试使用同一个会话请求另一个页面时,该后续请求将挂起,直到请求超时或会话文件变为可用。由于您正在执行内部CURL,因此运行CURL的脚本将锁定会话文件,并且CURL请求无法完成,因为目标页面无法加载会话。

+0

所以,我不能做一个CURL请求到同一台服务器?有没有办法解决这个问题? – Trialien 2011-03-23 22:41:06

+21

您可以确保执行CURL请求的脚本在'curl_exec()'之前立即使用'session_write_close()'关闭会话。如果需要更改会话中的任何内容,可以随后再次执行'session_start()'。 – 2011-03-24 00:45:42

+3

我想马克的评论应该在答案中,因为它只是在这里解决了我的问题 – 2012-06-14 12:54:56

1

你应该重构你的代码。除了Marc B提到的之外,这种方法将不必要地拖慢你的脚本速度(可能会大幅度降低)并引起很多混淆。没有冒犯性,但这只是一个令人难以置信的不良逻辑修复。

+0

我明白你的意思,但这不是我们在生产服务器上做的事情,这将用于后台进程,其中性能不是问题。仍然感谢您的意见。 – Trialien 2011-03-24 13:35:36

2

因为当你试图请求与公网IP的本地服务器,Apache的无法解析其地域。所以你必须检查哪个本地ip apache使用该域名。然后,您需要编辑/ etc/hosts文件,并使用本地ip加上您的域添加新行。例如:

我在Apache的虚拟主机域名本地IP为:172.190.1.120,我的域名是mydomain.com 所以我要补充:

172.190.1.120 mydomain.com

然后你的卷曲会正常工作。

+0

这发生在我身上:)卷曲请求工作到所有的url,但我的和这做了伎俩。感谢您的解决方案 – Sogeking 2017-02-23 08:56:56

相关问题