http://www.php.net/downloads.php에 있는 2010.07.21일짜 PHP 5.2.14 윈도우용 바이너리는 받지 마시기 바랍니다. zlib.dll이 포함되어 있지 않은 php_curl.dll extension을 포함하고 있어서 Invalid access to memory location 오류가 발생합니다.
Tag: PHP
PHP의 print_r 함수를 ASP로 구현해보자.
PHP에는 변수의 내용을 쉽게 볼 수 있는 print_r 이란 함수가 있다. 변수형태와 상관없이 변수명만 인자로 넘겨주면 변수에 저장된 내용을 재귀적으로 표시해 줘서 디버깅시 특히 요긴하게 쓸 수 있다. ASP에서는 안타깝게도 유사한 함수가 없어서 비슷한 기능을 하는 함수를 만들어 봤다.
<%
Sub print_r(var)
Dim myPrint
Set myPrint = New clsPrint
myPrint.print var, 0
End Sub
Class clsPrint
Public Sub print(var, nIndent)
Dim nType, sTypeName
'Response.Write TypeName(var)
nType = VarType(var)
Select Case nType
Case 0:
Response.Write "(vbEmpty)"
Case 1:
Response.Write "(vbNull)"
Case 2:
Response.Write var & "(vbIngerger)"
Case 3:
Response.Write var & "(vbLong)"
Case 4,5:
Response.Write var & "(vbSingle)"
Case 6:
Response.Write var & "(vbCurrency)"
Case 7:
Response.Write var & "(vbDate)"
Case 8:
Response.Write var & "(vbString)"
Case 9:'vbObject
sTypeName = TypeName(var)
Select Case sTypeName
Case "ISessionObject": 'Session
print_session var, nIndent
Case "IRequest": 'Request
print_request var, nIndent
Case "IApplicationObject": 'Application
print_application var, nIndent
Case Else
Response.Write "Unimpleneted TypeName:" & sTypeName
End Select
Case 10:
Response.Write "(vbError)"
Case 11:
Response.Write var & "(vbBoolean)"
Case 12:
Response.Write "(vbDataObject)"
Case 13:
Response.Write "(vbDecimal)"
Case 14:
Response.Write "(vbByte)"
Case 8192,8204:
print_array var, nIndent + 1
Case Else:
Response.Write "VarType:" & nType
End Select
Response.Write vbCrLf
End Sub
Sub print_array(var, nIndent)
print_list "Array", var, nIndent
End Sub
Sub print_request(var, nIndent)
print_name "Request", nIndent
print_openbrace nIndent
print_dict "Request.Form", var.Form, nIndent + 1
print_dict "Request.QueryString", var.QueryString, nIndent + 1
print_dict "Request.Cookies", var.Cookies, nIndent + 1
print_dict "Request.ServerVariables", var.ServerVariables, nIndent + 1
print_closebrace nIndent
End Sub
Sub print_application(var, nIndent)
print_name "Application", nIndent
print_openbrace nIndent
print_dict "Application.StaticObjects", var.StaticObjects, nIndent + 1
print_dict "Application.Contents", var.Contents, nIndent + 1
print_closebrace nIndent
End Sub
Sub print_session(var, nIndent)
print_name "Session", nIndent
print_openbrace nIndent
print_dict "Session.StaticObjects", var.StaticObjects, nIndent + 1
print_dict "Session.Contents", var.Contents, nIndent + 1
print_closebrace nIndent
End Sub
Sub print_dict(sTypeName, var, nIndent)
Dim sKey
print_name sTypeName, nIndent
print_openbrace nIndent
For Each sKey In var
print_key sKey, nIndent + 1
print var(sKey), nIndent + 1
Next
print_closebrace nIndent
End Sub
Sub print_list(sTypeName, var, nIndent)
Dim vValue, nIndex
Response.Write sTypeName & vbCrLf
print_openbrace nIndent
nIndex = 0
For Each vValue In var
print_key nIndex, nIndent + 1
print vValue, nIndent + 1
nIndex = nIndex + 1
Next
print_closebrace nIndent
End Sub
Private Sub print_name(sName, nIndent)
print_indent nIndent
Response.Write sName & vbCrLf
End Sub
Private Sub print_key(sKey, nIndent)
print_indent nIndent
Response.Write "[" & sKey & "] => "
End Sub
Private Sub print_openbrace(nIndent)
print_indent nIndent
Response.Write "(" & vbCrLf
End Sub
Private Sub print_closebrace(nIndent)
print_indent nIndent
Response.Write ")" & vbCrLf
End Sub
Private Sub print_indent(nIndent)
Response.Write String(nIndent * 4, " ")
End Sub
End Class
a = "123"
b = Split("1 2 3 4 5", " ")
print_r a
print_r b
print_r Session
'print_r Application
'print_r Request
%>
위를 브라우져에서 실행해서 소스보기를 하면 다음의 결과를 얻을 수 있다.
123(vbString) Array ( [0] => 1(vbString) [1] => 2(vbString) [2] => 3(vbString) [3] => 4(vbString) [4] => 5(vbString) ) Session ( Session.StaticObjects ( ) Session.Contents ( ) )
배열도 지원하고, Application, Session, Request 객체의 내용도 볼 수 있다. 자체적으로 쓰는 객체는 “Unimpleneted TypeName”이란 결과가 나올텐데, 이는 소스에다 해당 객체를 출력하는 부분을 추가해 주면 된다.
[PHP] Proxy 서버를 이용해서 원격 웹서버 내용 갖고 오기
이씨플라자는 중문으로 서비스되는 이씨플라자 중문 사이트가 따로 있고, 대부분의 사용자는 중국업체들이다. 서버는 현재 국내 KTNET IDC에 있다. 요즘 알 수 없는 이유(?)로 중국에서 이씨플라자 중문 사이트에 접속하는데 장애가 많이 발생해서, 이를 탐지하는 프로그램을 만들어야만 했다. 중국사용자 환경에서 접속을 테스트해야 하니깐 중국내 공개된 proxy 서버를 이용하기로 했다.
전에 올린 “MSXML2.ServerXMLHTTP 사용하여 원격 웹서버 내용 갖고 오기” 포스트에서 사용한 MSXML2.ServerXMLHTTP 컴포넌트를 사용하려고 했는데 허걱.. 이 컴포넌트는 Proxy 서버를 지정할 수 있는 방법을 제공하지 않는 것이다. 별 수 없이 막강한 함수를 갖고 있는 php를 좀 뒤져봤다. 역시 여기에는 해결책이 있었다.
Proxy 서버를 이용해서 http 통신을 하는 get_contents 라는 함수를 하나 만들어서 사용했다. 혹시나 Proxy 서버를 사용할 필요가 있으신 분들은 참고하시기를.
function get_contents($url, $proxy = "") {
//이 부분은 반드시 필요하지는 않지만,
//User-Agent를 체크하는 사이트가 있다면 필요함.
$header = "User-Agent: Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.1;+SV1;)";
if (empty($proxy)) {
// proxy를 사용하지 않음
$opts = array(
'http' => array(
'request_fulluri' => true,
'header' => $header
),
);
} else {
// proxy를 사용함
$opts = array(
'http' => array(
'proxy' => 'tcp://'.$proxy,
'request_fulluri' => true,
'header' => $header
),
);
}
$context = stream_context_create($opts);
$html = file_get_contents($url, false, $context);
$html;
}