怎么观察 PHP 程序的执行

2015-08-30 18:43:42 +08:00
 adrianzhang
一个 PHP file ,向一个 web api 提出 POST 请求。我不懂 PHP ,想看看这个 POST 请求的整个 URL 是什么样的,怎么才能办到呢?
这个 PHP file 现在我的电脑上,取名 test.php ,可以用 php test.php 运行。
2510 次点击
所在节点    问与答
28 条回复
chairuosen
2015-08-30 18:49:14 +08:00
echo 大法好
麻烦点的就是 ide+xdebug
adrianzhang
2015-08-30 18:53:29 +08:00
@chairuosen 还是不太明白,用 echo 怎么看?
falcon05
2015-08-30 18:59:34 +08:00
抓包,简单粗暴
seki
2015-08-30 19:00:04 +08:00
echo 就相当于一些语言的 print
想看哪个对象就 echo 哪个对象……
adrianzhang
2015-08-30 19:03:01 +08:00
@falcon05 痛苦的是这是个 https 请求,我用了 tcpdump ,也是一片茫然~~

@seki 懂了,多谢。
adrianzhang
2015-08-30 19:11:19 +08:00
@seki 还是不出结果
我是把源文件里: curl_setopt ($ch, CURLOPT_URL, $authUrl );
改成
$test = curl_setopt ($ch, CURLOPT_URL, $authUrl );
echo $test;

然后再执行 php test.php ,但是还是没有结果。应该改成什么呢?
des
2015-08-30 19:31:31 +08:00
@adrianzhang
print_r ($ch );
或者
var_dump ($ch );
$tset 只是个布尔值而已
adrianzhang
2015-08-30 19:33:01 +08:00
@des 好的,我试试。
shiny
2015-08-30 19:34:29 +08:00
本地开 fiddler 然后设置 curl 的代理为 fiddler 的
adrianzhang
2015-08-30 19:43:32 +08:00
@des 还是不行,麻烦看一眼那源代码,给个指示,该怎么截胡。。求你了。

@shiny 啊呀,动静好大。。怎么在这个 php 里给 curl 设置代理呢?
feiyuanqiu
2015-08-30 19:52:28 +08:00
//Create an Http Query.//
$paramArr = http_build_query ($paramArr );
//Set the Curl URL.
curl_setopt ($ch, CURLOPT_URL, $authUrl );
//Set HTTP POST Request.
curl_setopt ($ch, CURLOPT_POST, TRUE );
//Set data to POST in HTTP "POST" Operation.
curl_setopt ($ch, CURLOPT_POSTFIELDS, $paramArr );

$authUrl 是请求 url 地址
$paramArr 是 post 过去的参数

你可以直接在 curl_setopt ($ch, CURLOPT_POSTFIELDS, $paramArr ); 这里 var_dump ($authUrl, $paramArr );exit; 就能看到你要的东西了
ljbha007
2015-08-30 19:59:57 +08:00
代码里有啊

http://api.microsofttranslator.com/v2/Http.svc/Detect?text=

text 是参数
请求头里有 basic auth


OAuth 的地址是

https://datamarket.accesscontrol.windows.net/v2/OAuth2-13

参数文章里有说
ljbha007
2015-08-30 20:04:42 +08:00
先访问 https://datamarket.accesscontrol.windows.net/v2/OAuth2-13

然后照这个格式 post

grant_type=client_credentials&client_id={0}&client_secret={1}&scope=http://api.microsofttranslator.com

{0}是 client_id
{1}是 client_secret

返回的是个 json
access_token 字段就是 access_token

http://api.microsofttranslator.com/v2/Http.svc/Detect?text=
然后请求翻译 api 的时候加个 Authorization: Bearer {access_token}的请求头就可以了
{access_token}是前面得到的请求头
ChoateYao
2015-08-30 20:21:59 +08:00
CURLOPT_VERBOSE 、 CURLOPT_STDERR
启用这两个参数即可。
adrianzhang
2015-08-30 20:27:54 +08:00
@feiyuanqiu
多谢!明白了这个构造。

@ljbha007
很感激这么详细的说明。我是用 python 来构造这个的。所以就想知道 PHP 这个实现跟我的到底哪儿不一样。不知你是否也懂 python ,若懂,也请看看我这段代码到底怎么回事,总是拿不回 token 的 json 值。写成以下这样,总是得到 400 bad request 。



class Microsoft_translator_api ():
"""translate text only"""

def __init__(self, text ):
self.text = text
self.request_url = "datamarket.accesscontrol.windows.net/v2/OAuth2-13"
self.client_id = "我的应用名"
self.client_secret = "我的密钥"
self.grant_type = "client_credentials"
self.scope = "http://api.microsofttranslator.com"

def get_token (self ):
params = urllib.urlencode ({'@grant_type': self.grant_type, '@scope': self.scope, '@client_id': self.client_id, '@client_secret': self.client_secret})
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
request_token = httplib.HTTPConnection (self.request_url )
request_token.request ("POST", "", params, headers )
response = request_token.getresponse ()
print response.status, response.reason
token = response.read ()
#print token
request_token.close ()
return (token )
adrianzhang
2015-08-30 20:28:31 +08:00
@ChoateYao 谢谢,又学了一招。
MaiCong
2015-08-30 20:31:20 +08:00
adrianzhang
2015-08-30 20:32:45 +08:00
@ljbha007 忘记用 markdown 了。代码如下:

```

class Microsoft_translator_api ():
"""translate text only"""

def __init__(self, text ):
self.text = text
self.request_url = "datamarket.accesscontrol.windows.net/v2/OAuth2-13"
self.client_id = "我的应用名"
self.client_secret = "我的密钥"
self.grant_type = "client_credentials"
self.scope = "http://api.microsofttranslator.com"

def get_token (self ):
params = urllib.urlencode ({'@grant_type': self.grant_type, '@scope': self.scope, '@client_id': self.client_id, '@client_secret': self.client_secret})
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
request_token = httplib.HTTPConnection (self.request_url )
request_token.request ("POST", "", params, headers )
response = request_token.getresponse ()
print response.status, response.reason
token = response.read ()
#print token
request_token.close ()
return (token )

```
ljbha007
2015-08-30 20:32:57 +08:00
@adrianzhang
你参数对象为什么要加 @符号?
还有 Accept 改成 application/json 活着直接删掉试试
adrianzhang
2015-08-30 20:33:41 +08:00
为什么不支持我的代码块??

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/217146

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX