lotfile_get_contents

file_get_contents  时间:2021-05-19  阅读:()
CopyrightIBMCorporation2006TrademarksBuildingPHP-basedUIsforIBMLotusDominoPage1of14BuildingPHP-basedUIsforIBMLotusDominoAndreiKouvchinnikovMay09,2006DiscoverhowyoucaninteractwithLotusDominodatabasesfromWebapplicationscreatedinthePHPprogramminglanguage.
LearnhowtoaccessDominoapplicationsfromPHPpagesusingaCOMobject,theLotusNotesAPI,andXML.
Inthisarticle,youlearnhowtointeractwithIBMLotusDominodatabasesfromWebapplicationscreatedwiththePHPprogramminglanguage.
YoualsolearnhowtoaccessDominoapplicationsfromPHPpagesusingaCOMobject,theIBMLotusNotesapplicationprogramminginterface(API),andXML.
CodeexamplesforeachmethodareincludedintheDownloadssection.
TheXMLmethodalsohasadownloadableexampleapplicationwithasimpleWebinterfacetoanIBMLotusDominomaildatabase(seefigure1).
Figure1.
ExampleofaPHPuserinterfacetoamaildatabasePHPisapowerfulembeddedscriptinglanguage.
ItisfreetouseandpopularfordevelopingdynamicWebapplications.
PHPcodeisn'tcompiled;rather,it'sinterpretedatruntime.
MuchofitssyntaxisborrowedfromtheC,Java,andPerlprogramminglanguages.
YoucanaddPHPasaCommonGatewayInterface(CGI)enginetomostWebservers.
ItevenworksintheMicrosoftWindowsandLinuxoperatingsystems.
Inaddition,morethan50percentofWebhostingcompanieshavePHP-enabledservers.
WithsuchwidespreadPHPtechnology,yousimplycannotaffordtoremainunfamiliarwithit.
WorkingwithPHPYouincludePHPcodeinWebpageswiththehelpofspecialtags.
AllPHPcodebeginswiththetag:developerWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage2of14TheWebserverinterpretsthissimpleexampleandtranslatesittofollowingHTMLoutput:HelloWorld!
PHPWebpagescaninteractwithDominodatabasesinseveralways.
ThechoiceofintegrationmethoddependsonwhichoperatingsystemyouusetorunPHP,thesecurityrestrictionsinplacebetweenPHPandyourDominoservers,andwhatyouareallowedtoinstallonthePHPserver.
Themethodsdescribedinthisarticleare:COMobjectsTheNotesAPIXMLthroughtheWebRunningPHPcodeofflineAlthoughPHPisprimarilyintendedtorunonaWebserverandisnotforstandaloneapplications,youcanrunitfromthecommandlineasashellscriptingtoolsimilartoMicrosoftVisualBasicScriptingEdition(VBScript).
ThisfeaturecanbeusefulforofflinetestingbeforeputtingthefilesontheWebserver.
AccessingLotusDominoThreemethodsareavailableforaccessingaDominodatabase:throughCOMobjects,throughtheNotesAPI,andthroughXML.
AccessLotusDominousingDominoCOMobjectsTheeasiestandmostfast-forwardmethodofaccessinginformationstoredinDominodatabasesisthroughDominoCOMobjects.
UsingCOMfromPHPisn'tmuchmoredifficultthandoingsofromLotusScript.
Thefollowingcodeexampleshowshowtoprintthefieldvaluesofallthedocumentsinaview.
Initialize();//ShowthenameofthecurrentNotesuserprint"Currentuser:".
$session->CommonUserName.
"\n\n";//Getdatabasehandle$db=$session->getDatabase("","mailtest.
nsf");//Getviewhandleusingpreviouslyreceiveddatabasehandle.
//Notethatthereservedcharacterintheviewnamemustbe\-escaped$view=$db->getView("(\$Drafts)");ibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage3of14//Getfirstdocumentinviewusingpreviouslyreceivedviewhandle$doc=$view->getFirstDocument();//Loopuntilalldocumentsinviewareprocessedwhile(is_object($doc)){//Gethandletoafieldcalled"Subject"$field=$doc->GetFirstItem("Subject");//Gettextvalueofthefield$fieldvalue=$field->text;//Showthevalueofthefieldprint"Subject:".
$fieldvalue.
"\n";//Getnextdocumentintheview$doc=$view->getNextDocument($doc);}//Releasethesessionobject$session=null;>Figure2showstheoutputfromrunningthisCOMobjectfromthecommandline.
Figure2.
ResultofrunningCOMobjectcodeatacommandpromptUsingCOMobjectsiseasy,buttherearesomedisadvantagesthatmakeCOMratherlimited.
ThemaindisadvantageisthatyoumusthaveLotusNotesclientsoftwareinstalledonthePHPserver.
Ifyou'reusingaWebhostingcompanyforyourPHPapplications,thereisn'tmuchyoucandotoconvincethehostingcompanytoinstallaNotesclientjustforpurposesofyourPHPWebsite.
IfyouhaveyourownPHPserverorperhapsPHPandDominoserversonthesamecomputer,youshouldhavenoproblemssettingupCOMaccesstotheDominoserver.
AnotherissuethatlimitsCOMuseisthatCOMobjectsaresupportedonlyontheWindowsplatform.
ConsideringthatmostPHPserversrunontheLinuxplatform,thisrequirementconsiderablyreducesthenumberofavailableserversthatcanhostyourCOMsolution,evenifyouhavefulladministrativecontrolforthoseservers.
AccessLotusDominothroughanAPIAnalternativetoCOMaccessistousetheLotusNotes/DominoCAPI.
Theoretically,youcanusethissolutiononoperatingsystemsotherthanWindows.
WerecommendthatonlydeveloperswhohavealotofexperienceinC/C++programminguseit(ifyouhaveareasonfornotusingaCOMinterfaceorXML).
ThefunctionalityprovidedinthesampleAPIsolutionislimited,andyoumustbasicallywriteyourowncodeintheCprogramminglanguagetoaccomplishmosttasks.
developerWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage4of14ThesamplelibraryprovidesagoodexampleforcreatingPHPextensions.
Itcomesonlyassourcecode,andyoumusthavetheVisualCcompilerandtheDominoCAPItoolkittocompilethecode.
Foryourconvenience,we'vecompiledthesourcecodeintoaDLLfileandincludeditintheDownloadssection.
YoucanactivatetheNotesextensionbyaddingthefollowinglinetothephp.
iniconfigurationfile:extension=php5_notes.
dllThefollowingcodeexampleshowshowtousethistechniqueafteryouproducetherequiredDLL.
Figure3showstheoutputfromrunningtheAPIcodefromthecommandline.
Figure3.
OutputoftheAPIcodeAccessLotusDominousingXMLUsingXMLtointeractwithDominodatabasesisthemostcompatiblesolution.
Itdoesn'trequireanyspecialadjustmentsorinstallationsonthePHPWebserver,anditworksonalloperatingsystems.
Inouropinion,it'sthebestapproachinmostcases.
IntheXMLsolutioninthisarticle,youusetechniquesthataremostlikelytoworkinthemajorityofconfigurations.
Asanexample,youcreateaPHPinterfacetoastandardDominomaildatabase.
TheonlymodificationmadeintheDominoenvironmentisaLotusScriptagentusedtoviewfieldsfromthemaildocuments.
YouusethesameagenttoparsetheXMLandtocreateandsendmail.
ibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage5of14ToviewtheInboxfolderfromthemaildatabase,completethesesteps:1.
AsktheuserforhisorherNotesusernameandpassword.
2.
SendaloginrequesttotheDominodatabaseusingtheusernameandpasswordprovided(seefigure4).
Figure4.
LoginscreeninthePHPsampleapplication3.
Fromtheloginresponse,getasessioncookie.
(YouneedthiscookieforsubsequentrequeststotheDominodatabase.
)4.
MakearequesttotheDominoserverfortheXMLsourceoftheInboxfolder,usingtheReadViewEntriesURLcommand.
ThiscommandreturnsthecontentoftheviewpresentedinXMLforminsteadofreturningHTML.
YoutellDominoyouridentitybyappendingasessioncookietotherequestheaders.
5.
OnthereceivedXML-formattedviewcontent,usePHP'sXMLparsertofinddocumentsandfields.
6.
WhentheXMLparserhasprocessedthewholedocument,constructtheHTMLcode,andprinttothebrowser.
Tomakeamailmessageaclickablelink,usetheUNIDattributeofeachdocumentnode.
ToaccessDominodatabases,youneedfunctionalitybothtogetaWebpagefromtheDominoserverandtoparsetheXML.
Youmustalsoassumethefollowingforpurposesofthedemoapplication:TheDominoserverisversion6orlater;otherwise,youcan'tuseLotusScript'sXML-parsingfunctionality.
(ThisLotusScriptagentisdiscussedinmoredetaillater.
)ThePHPWebserverallowsoutgoingWebrequests.
TheDominoserverisaccessiblefromthePHPWebserverbyeithertheInternetoranintranet.
Note:Ifyoucan'taccesstheDominoserverfromtheInternet,youmayneedtoadjustyourfirewallconfigurationtoallowtrafficfromthePHPserver.
PHPfunctionsforreadingWeb-basedDominofilesPHPhasseveralfunctionsforretrievingWeb-basedcontent.
ThesefunctionswereincludedinPHPfromtheinception,butadministratorshaven'talwaysactivatedthem.
ThefollowingfunctionscanretrieveafilefromtheWeb:developerWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage6of14file_get_contents().
Thisfunctioniseasytouse,anditsupportsboththeGETandPOSTrequesttypes.
Withfile_get_contents(),yougetthewholeWebfileatonceasastring.
fopen().
ThismethodreadstheWebfileinchunks.
file().
ThismethodreadsthewholeWebfileandseparatesthefile'scontentlinebyline.
It'sakindofcross-overbetweenfile_get_contents()andfopen().
fsockopen().
ThisfunctionhasthegreatestchanceofbeingactivatedonthehostingWebserver.
Themaindifferencebetweenthisandotherfunctionsisthatwithfsockopen(),youmustcreatethewholeWebrequestbyyourselfinsteadofsettingdifferentparameters.
CURL.
TheClientURLLibrary(CURL)hasthemostadvancedfunctionality.
UsingCURL,youcanconnecttoandcommunicatewithmanydifferenttypesofserverswithmanydifferenttypesofprotocols.
CURLcurrentlysupportsHTTP,HTTPS,FTP,Gopher,Telnet,DICT,File,andLDAP.
Italsosupportsproxies,cookies,andauthentication.
Unfortunately,CURLisoftendisabledbyWebhostingcompanies.
Note:Intheexampleapplicationinthisarticle,youusethefile_get_contents()functionexclusively.
ObtainingtheDominosessioncookieisanimportantpartoftheprocess,andyoucanusethesamecodeinotherDomino-relatedapplications.
Forexample,youcanretrieveacookieforloggingintotheIBMLotusSametimeserverusingSTLinks.
YougetthesessioncookiebysendingaPOSTrequesttotheDominoserver.
Inthatrequest,youincludeyourusernameandpassword.
TheresponsefromtheservercontainsacookiethatyouuseinsubsequentrequeststotheDominoserver.
Byincludingasessioncookie,theDominoserverthinksthatyourscriptisactuallyahumanuserwhorecentlyloggedinandisnowaccessingthedatabase.
YouusethePOSTmethodinsteadoftheGETmethodbecauseURLsoftheGETmethodareloggedintheDominolog,andanyonewhoaccessesthelogcanseetheusernameandpasswordinplaintext.
WiththePOSTmethod,usernamesandpasswordsaren'tpartoftheURL;therefore,theyaren'tvisibleinregularlogs.
YoucanfindtheDominosessioncookieintheSet-Cookieresponseheader.
ThesessioncookieiscalledeitherDomAuthSessIdorLtpaToken.
YouusethenameLtpaTokenwhentheDominoserverisconfiguredforsinglesign-on(SSO).
Youdon'tactuallycarewhatthecookienameis;yousimplysavethewholecookiestring.
Thefollowingcodeexampleshowshowtoretrievethecookie.
$req="username=john+doe&password=john123";$opts=array("http"=>array("method"=>"POST","content"=>$req,"header"=>"Accept-language:en\r\n".
"User-Agent:Mozilla/4.
0(compatible;MSIE6.
0;WindowsNT5.
1)\r\n"));$context=stream_context_create($opts);if(!
($fp=fopen("http://server.
com/maildb.
nsflogin","r",false,$context))){ibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage7of14die("CouldnotopenloginURL");}$meta=stream_get_meta_data($fp);for($j=0;isset($meta["wrapper_data"][$j]);$j++){if(strstr(strtolower($meta["wrapper_data"][$j]),'set-cookie')){$cookie=substr($meta["wrapper_data"][$j],12);break;}}fclose($fp);$_SESSION["DominoCookie"]=$cookie;Inthecodeline$req="username=john+doe&password=john123",youprovideavalidusernameandpasswordtobeusedforloggingintotheDominoserver.
Then,yousetupadditionaloptions,suchasthePOSTmethodtypeandotherheaders.
Afterthat,youapplyyouradditionaloptionstotheoutgoingHTTPrequest:fopen("http://server.
com/mydb.
nsflogin","r",false,$context)FromtheresponseyoureceivefromtheDominoserver,yougetalltheheadersusingthestream_get_meta_data($fp)functionandloopthroughtheheadersuntilyoufindtheonethatcontainstheSet-Cookiestring.
Afterthat,yousavethecookiebystoringitinsideasessionvariable:$_SESSION["DominoCookie"]=$cookie$_SESSIONholdsthecookievalueuntilyouclosetheWebbrowser.
Now,youapplythecookietoyournextrequest,whichretrievestheInboxview/folderfromaDominomaildatabase.
$opts=array('http'=>array('method'=>"GET",'header'=>"Accept-language:en\r\n".
"User-Agent:Mozilla/4.
0(compatible;MSIE6.
0;WindowsNT5.
1)\r\n".
"Cookie:".
$_SESSION["DominoCookie"].
"\r\n"));$context=stream_context_create($opts);$xml=file_get_contents("http://server.
com/maildb.
nsf/(\$Inbox)ReadViewEntries",false,$context);Thistime,youusetheGETmethodtodownloadaWebpageinsteadofthePOSTmethod.
Thismethodisspecifiedwiththe'method'=>"GET"lineintheHTTPoptionsarray.
Insteadofreadingonlyheaders,youreadthewholeresponseusingthefile_get_contents(URL,false,context)function.
TheresultofthisoperationisalongXMLstringcontainingallthecolumnsfromtheInboxview.
Youappendthesessioncookietotheheaderwith:"Cookie:".
$_SESSION["DominoCookie"].
"\r\n"developerWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage8of14AfteryoureceivetheXMLdata,youcanprocessitinthePHPXMLparser.
Then,youcreateyourownuserinterfacefortheInboxview.
PHPfunctionsforprocessingXMLInPHP,justasintheLotusScriptandJavaprogramminglanguages,therearetwowaysofprocessingXMLcode:theSimpleAPIforXML(SAX)andtheDocumentObjectModel(DOM).
SAXisanevent-basedprogrammingmodel,andit'sincludedandenabledbydefaultinmostPHPWebservers.
TheDOMextensionmustbeactivatedbytheWebserver'sadministrator.
AlthoughDOMismucheasiertoprogramwith,intheseexamples,youusetheSAXparserbecauseyouwanttoachievemaximumcompatibilitywithmostPHPconfigurations.
TechniquessimilartoprocessingDominoviewscan--withsmallmodifications--beusedforprocessingotherXMLsources,suchasRSSfeedsandevenWebservices.
ThefollowingcodeexampleshowstheXMLsourceoftheInboxviewcontainingonedocument.
00DonaldDuck17820060402T205929,52+0220060402T205929,52+028230seenMickeyAsyoucansee,documentsintheXMLsourcearepresentedwiththetag,andcolumns(fields)arepresentedwithtags.
Thedocument'sUniversalIDisavailableasanattributeofthenode.
ibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage9of14Allyouneedtodoisdetermineawaytoprogrammaticallyfindthevaluesbetweenthosetagstogetallthedatayouneed.
Soundseasy,anditiseasytoaccomplish,too.
First,initiatetheXMLparserobjectusingthexml_parser_createfunction:$xml_parser=xml_parser_create();Then,setcallbackfunctions,whichareresponsibleforhandlingthestartandendofXMLelements.
Thesefunctionsareidentifiedtotheprocessorthroughtheuseofthexml_set_element_handlerandxml_set_character_data_handlerfunctions.
Eachfunctionacceptstheparserhandleandthenamesofthecallbackfunctions:xml_set_element_handler($xml_parser,"startElement","endElement");xml_set_character_data_handler($xml_parser,"textData");YoumustaddthestartElement,endElement,andtextDatafunctionstoyourPHPcode:functionstartElement($parser,$name,$attributes){switch($name){case"VIEWENTRY":$main="VIEWENTRY";if($attributes["UNID"]!
=""){$current_doc=$attributes["UNID"];$unids[$doc_counter]=$current_doc;}break;case"ENTRYDATA":$main="ENTRYDATA";if($attributes["COLUMNNUMBER"]!
=""){$current_column=$attributes["COLUMNNUMBER"];}break;case"DATETIME":$main="DATETIME";break;default:break;}}functionendElement($parser,$name){if($name=="VIEWENTRY"){$doc_counter++;//increasedocumentcounterby1}$current_column="";}functiontextData($parser,$data){switch($main){case"ENTRYDATA":if(isset($doc_coll[$current_doc][$main])){$doc_coll[$current_doc][$main][$current_column].
="$data";}else{$doc_coll[$current_doc][$main][$current_column]="$data";}break;case"DATETIME":if(isset($doc_coll[$current_doc][$main])){$doc_coll[$current_doc][$main].
="$data";}else{$doc_coll[$current_doc][$main]="$data";developerWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage10of14}break;case"VIEWENTRY":break;}}So,let'sseehowitworks.
WhentheXMLparsergoesthroughtheXMLsourceandfindsthatanewelementisstarted,ittriggersthestartElementfunction,whichyouspecifiedasacallbackfunction.
Inthiscase,suchastartingelementnameis.
Nowyouknowthatthecurrentelementbeingprocessedisanewcolumn,soyoucansetthe$current_columnvariabletothenumberofthecolumn.
Inthiscase,columnsrepresentfields:case"ENTRYDATA":$main="ENTRYDATA";if($attributes["COLUMNNUMBER"]!
=""){$current_column=$attributes["COLUMNNUMBER"];}break;Afterthat,theparserfindsthetextinsidethenodeandsendsittothetextDatafunctionthatyouspecifiedasacallbackfunction.
Thepurposeofthisfunctionistoallowyoutopopulateanarraywithvaluesinsidethenode:switch($main){case"ENTRYDATA":if(isset($doc_coll[$current_doc][$main])){$doc_coll[$current_doc][$main][$current_column].
="$data";}else{$doc_coll[$current_doc][$main][$current_column]="$data";}break;UsingtheXMLsourceexample,the$doc_coll[$current_doc][$main][$current_column]="$data"codelineis:$doc_coll["38B16601EC8B42BAC12571440068335C"]["ENTRYDATA"]["8"]="seenMickey"ThismeansthattheeighthcolumnintheInboxviewforthedocumentwithUniversalID38B16601EC8B42BAC12571440068335Cis"seenMickey",whichhappenstobethesubjectofthemailmessage.
TheXMLparseris"smart"andknowsthatifanelementisstarted,itmustbefinishedsomewhere.
So,whenitfindstheendoftheelement,itsignalsyoubytriggeringtheendElementfunction(that'sright:thesamefunctionnameyouspecifiedasyoursecondcallbackfunction).
Inthatfunction,youresetthecolumnnumberbecauseitisn'tneededanymore.
Youalsocheckwhetherthedocumentcountermustbeincreased.
Youusethe$doc_countervariableasacounterforthearraythatstoresUniversalIDs.
YoumuststoreUniversalIDsmainlyforthepurposeofaddinglinkstothemaildocuments.
WhenyouknowthattheVIEWENTRYelementhasended,itmeansthatanewUniversalIDiscomingnext,andibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage11of14youhadbetterincreasethecurrentarraynumberby1tokeepthe$doc_colland$unidsarraysintact:if($name=="VIEWENTRY"){$doc_counter++;}$current_column="";Ifyoudownloadthesampleapplicationandrunitonyourownserver,yourversionoftheDominomaildatabasemayhavedifferentplacementofcolumnsinthemailviews.
Ifso,youmustadjustthecolumnnumbersinthePHPcode(docfunctions.
php).
ThesamplePHPapplicationandtheLotusScriptagentThissectionisaboutaDominoagentcalledProcessDocWebAction,whichisincludedaspartofthesampleapplicationyoucandownloadwiththisarticle.
TheagentisprogrammedinLotusScriptandusestheDOMtoparseincomingXMLrequests.
BecauseitusesthenewXMLscriptclasses,youcanusetheapplicationonDominorelease6andrelease7servers,butnotonrelease5servers.
TherequeststhatthisagenthandlesareinitiatedfromthesamplePHPapplicationandcanbeofthefollowingtypes:CreateandsendamailmessageSaveanexistingmaildocumentSaveanewmaildocumentasdraftRequestinformationaboutthelocationofauser'sfileAdummyPingrequesttomakesurethatauserisstillloggedinTodeploytheagent,completethesesteps:1.
Copyallthetextfromthexmlagent.
lssfile.
2.
Createanewagentinadatabaseofyourchoice.
3.
Setthepropertiesoftheagentto"RunasWebuser"andthetargettoNone.
4.
Pastethecopiedcodeintothisnewagent.
5.
NametheagentProcessDocWebAction,andthensaveit.
6.
InthePHPfile(dominomail.
php),pointtotheURLlocationofthedatabaseinwhichtheagentresides.
OneofourmainprioritiesduringthecreationofthePHPsampleapplicationwastoensurethatitworkedonallstandardmaildatabaseswithoutdesignmodifications.
That'swhythisapplicationdoesn'trequireanychangestothemaildatabasedesign.
YoucanplacetheagentforprocessingtheXMLoutsidetheuser'smaildatabase,andthesameagentcanbeusedforservingallusers.
Whenauserauthenticatesforthefirsttime,thePHPapplication,afterretrievingthesessioncookie,asksthisagentforthelocationoftheuser'smailfile.
Theagentknowswhotheinvokeroftheagentisbecausetheagentisrunningwiththe"RunasWebuser"propertyactivated.
AfterdeveloperWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage12of14thisinitialrequest,thepathtotheuser'smaildatabaseissavedforre-useuntiltheuserclosestheWebbrowserorthesessionexpires.
AuserisalwaysauthenticatedusingrealDominoauthentication.
TheusercannotaccessanyresourcesheorshecannotaccessusingaWebbrowserclient,eveniftheusercouldmodifythePHPsourcecodeontheWebserver.
ConclusionIfyou'reaDominodeveloperoradministratorandyourDominoserverisn'taccessiblefromtheInternet,youcanstillgiveusersawaytoaccessdatastoredinDominodatabasesandallowthemtoreadandwriteemailmessages.
UsingtheXMLtechniquesdescribedinthisarticleandappliedinthesampleapplication,youcaneasilyimplementDominoauthenticationinyourownPHPapplicationstoverifyloginsagainsttheDominoDirectory.
Thereisnooverridingofauser'saccessrightsintheWeb-basedXMLsolution;theuserisusinghisorherowncredentialsineachoperation.
Thisensuresthatuserscannotaccessunauthorizeddata.
Tofurtherincreasesecurity,youcanimplementloggingoffailedloginattempts.
ibm.
com/developerWorks/developerWorksBuildingPHP-basedUIsforIBMLotusDominoPage13of14DownloadableresourcesDescriptionNameSizeSourcecodeofPHPapplicationphp_app_sample.
zip10KBLotusScriptagentusedforprocessingXMLxmlagent.
zip2KBCompiledversionofNotesAPIextensionphp_notes_dll.
zip21KBdeveloperWorksibm.
com/developerWorks/BuildingPHP-basedUIsforIBMLotusDominoPage14of14RelatedtopicsdeveloperWorksarticle,"ReadingandwritingtheXMLDOMwithPHP"PHPWebsitePHP:XMLParserFunctionsTryalivedemoofthePHPinterfacedemotoaDominomaildatabase.
DownloadatrialversionofLotusNotes7fromdeveloperWorks.
DownloadatrialversionofLotusDomino7fromdeveloperWorks.
DownloadthesourcecodeoftheNotesAPIextensionforPHPfromthePHPExtensionCommunityLibrary(PECL)site.
CopyrightIBMCorporation2006(www.
ibm.
com/legal/copytrade.
shtml)Trademarks(www.
ibm.
com/developerworks/ibm/trademarks/)

乌云数据(10/月),香港cera 1核1G 10M带宽/美国cera 8核8G10M

乌云数据主营高性价比国内外云服务器,物理机,本着机器为主服务为辅的运营理念,将客户的体验放在第一位,提供性价比最高的云服务器,帮助各位站长上云,同时我们深知新人站长的不易,特此提供永久免费虚拟主机,已提供两年之久,帮助了上万名站长从零上云官网:https://wuvps.cn迎国庆豪礼一多款机型史上最低价,续费不加价 尽在wuvps.cn香港cera机房,香港沙田机房,超低延迟CN2线路地区CPU...

MOACK:韩国服务器/双E5-2450L/8GB内存/1T硬盘/10M不限流量,$59.00/月

Moack怎么样?Moack(蘑菇主机)是一家成立于2016年的商家,据说是国人和韩国合资开办的主机商家,目前主要销售独立服务器,机房位于韩国MOACK机房,网络接入了kt/lg/kinx三条线路,目前到中国大陆的速度非常好,国内Ping值平均在45MS左右,而且商家的套餐比较便宜,针对国人有很多活动。不过目前如果购买机器如需现场处理,由于COVID-19越来越严重,MOACK办公楼里的人也被感染...

ZoeCloud:香港BGP云服务器,1GB内存/20GB SSD空间/2TB流量/500Mbps/KVM,32元/月

zoecloud怎么样?zoecloud是一家国人商家,5月成立,暂时主要提供香港BGP KVM VPS,线路为AS41378,并有首发永久8折优惠:HKBGP20OFF。目前,解锁香港区 Netflix、Youtube Premium ,但不保证一直解锁,谢绝以不是原生 IP 理由退款。不保证中国大陆连接速度,建议移动中转使用,配合广州移动食用效果更佳。点击进入:zoecloud官方网站地址zo...

file_get_contents为你推荐
蓝牙ios6处理器flashhttp://www.huajinsc.cn/支持ipad责任编辑:纪春traceroute网络管理工具traceroute是什么程序itunes备份怎么使用iTunes备份127.0.0.1DNS老是被修改为127.0.0.1,这是为什么?win7如何关闭445端口如何彻底永久取消win7粘滞键功能重庆电信宽带管家中国电信电脑管家是什么?怎么样?
免备案虚拟主机 kvmla t牌 加勒比群岛 webhosting shopex空间 directadmin 万网优惠券 asp免费空间申请 北京双线 泉州移动 上海服务器 网站在线扫描 360云服务 阿里云免费邮箱 江苏徐州移动 rewritecond 博客域名 七十九刀 cdn加速 更多