<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>php &#8211; 記下來</title>
	<atom:link href="https://noter.tw/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>https://noter.tw</link>
	<description>一路上踩到的坑、遇到的問題，一點一滴記下來，希望能幫助到需要的人~</description>
	<lastBuildDate>Sun, 12 Mar 2023 13:09:45 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.3</generator>

<image>
	<url>https://noter.tw/wp-content/uploads/cropped-old-1130742_1920-1-32x32.jpg</url>
	<title>php &#8211; 記下來</title>
	<link>https://noter.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>無法開啟 PHP ZipArchive 下載的 zip 檔</title>
		<link>https://noter.tw/10668/%e7%84%a1%e6%b3%95%e9%96%8b%e5%95%9f-php-ziparchive-%e4%b8%8b%e8%bc%89%e7%9a%84-zip-%e6%aa%94/</link>
					<comments>https://noter.tw/10668/%e7%84%a1%e6%b3%95%e9%96%8b%e5%95%9f-php-ziparchive-%e4%b8%8b%e8%bc%89%e7%9a%84-zip-%e6%aa%94/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Fri, 16 Dec 2022 13:19:02 +0000</pubDate>
				<category><![CDATA[網頁後端]]></category>
		<category><![CDATA[網頁前端]]></category>
		<category><![CDATA[技術相關]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ZipArchive]]></category>
		<category><![CDATA[PHP zip]]></category>
		<category><![CDATA[PHP 壓縮檔案]]></category>
		<category><![CDATA[ob_clean()]]></category>
		<category><![CDATA[網頁直接下載檔案]]></category>
		<guid isPermaLink="false">https://noter.tw/?p=10668</guid>

					<description><![CDATA[<p>PHP 內有一個用來操控壓縮檔的 ZipArchive 模組，今天收到問題回報說下載的 zip 檔沒辦法開啟，當下直覺認為是對方操作錯誤，給幾個同事測試之後，有一個同事同樣無法開啟，竟然是因為檔頭多了一些空白造成，這篇記錄此問題的解法。</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/10668/%e7%84%a1%e6%b3%95%e9%96%8b%e5%95%9f-php-ziparchive-%e4%b8%8b%e8%bc%89%e7%9a%84-zip-%e6%aa%94/" data-wpel-link="internal">無法開啟 PHP ZipArchive 下載的 zip 檔</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>PHP 內有一個用來操控壓縮檔的 ZipArchive 模組，今天收到問題回報說下載的 zip 檔沒辦法開啟，當下直覺認為是對方操作錯誤，給幾個同事測試之後，有一個同事同樣無法開啟，竟然是因為檔頭多了一些空白造成，這篇記錄此問題的解法。</p>



<span id="more-10668"></span>



<h2 class="para wp-block-heading">PHP 壓縮檔案</h2>



<p>這邊是留給自己的 ZipArchive 用法的 memo，確定載入此模組後，只要使用以下方法就可以輕鬆把檔案壓縮成 zip</p>



<pre class="EnlighterJSRAW" data-enlighter-language="php" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 建立 ZipArchive 物件
$zip = new ZipArchive();
// 在指定路徑中建立一個 zip 檔
$res = $zip->open('tmp_callback/123.zip', ZipArchive::CREATE);
// 把 tmp_callback/file1 新增至 zip 內，並改名為 00000001.txt
$zip->addFile('tmp_callback/file1', '00000001.txt');
// 關閉 zip 物件
$zip->close();</pre>



<h2 class="para wp-block-heading">透過網頁下載 zip 檔</h2>



<p>透過以下的語法可以讓瀏覽器直接下載 zip 檔，一方面在之前做權限控管以及避免洩漏檔案真實路徑</p>



<pre class="EnlighterJSRAW" data-enlighter-language="php" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">$path = "/var/www/html/uploads/";
$filename = '03082358.zip';
	
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($path . $filename));
@readfile($file);</pre>



<h2 class="para wp-block-heading">無法開啟壓縮檔的原因</h2>



<p>直到有使用者反應壓縮檔無法開啟，透過 <a href="https://unzip-online.com/en/zip" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">unzip-online.com<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 線上解壓縮也失敗</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img fetchpriority="high" decoding="async" src="https://lh3.googleusercontent.com/pw/AL9nZEUmC2qlg12i3weQMfhMjRT7Fs36NTNVuXgAmZ14RgARuzc-f3A5P6-R6RVcbFWjuV5zg2buO7UDMNQzmuJq7Yjz6p6uhzi36eDw9VLmBYSYsFfAzZnhLX-h94Sj4Ha-4Vu11rgEEmMHazPjEb01fLom=w940-h463-no?authuser=1" alt="AL9nZEUmC2qlg12i3weQMfhMjRT7Fs36NTNVuXgAmZ14RgARuzc f3A5P6 R6RVcbFWjuV5zg2buO7UDMNQzmuJq7Yjz6p6uhzi36eDw9VLmBYSYsFfAzZnhLX h94Sj4Ha 4Vu11rgEEmMHazPjEb01fLom=w940 h463 no?authuser=1 無法開啟 PHP ZipArchive 下載的 zip 檔" width="470" height="232" title="無法開啟 PHP ZipArchive 下載的 zip 檔"></figure></div>


<p>使用 notepad++ 開啟後才發現 zip 檔開頭有三行空白，可是有些電腦可以正常開啟有些電腦卻不行</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" src="https://lh3.googleusercontent.com/pw/AL9nZEVkfKvVTFLvsECju82DL81lA0cgTr9UbDAzMFQKa0EYoBTd7BkCwQVNsgf7pAeJbFT5wvfG7ovzLSIsHevoDTCTe6caIDyIJmvsoi6cgQzor9JIL0mvkwUAsczIPFE7Eq6i99yno-QHzmq8WTTKaliH=w208-h119-no?authuser=1" alt="AL9nZEVkfKvVTFLvsECju82DL81lA0cgTr9UbDAzMFQKa0EYoBTd7BkCwQVNsgf7pAeJbFT5wvfG7ovzLSIsHevoDTCTe6caIDyIJmvsoi6cgQzor9JIL0mvkwUAsczIPFE7Eq6i99yno QHzmq8WTTKaliH=w208 h119 no?authuser=1 無法開啟 PHP ZipArchive 下載的 zip 檔" width="156" height="89" title="無法開啟 PHP ZipArchive 下載的 zip 檔"></figure></div>


<p>只要把那三行空白刪除，就可以正常解壓縮了 &#8230;</p>



<h2 class="para wp-block-heading">無法開啟壓縮檔的解決方法</h2>



<p>一開始以為是 ZipArchive 模組的問題，做了各種嘗試後發現，產出來的 zip 是正常的，並沒有上面那三行空白，那問題就是出在下載這段了。</p>



<p>試了很多方法發現只要有<code>&lt;?php include_once "xxx.php" ?&gt;</code>就會有三行空白的狀況，一開始笨笨的試著把所有用到的 include 都拔進來放，後來覺得這樣實在是又累又蠢，最後終於找到簡單解法 &#8230; 只要在<code>readfile</code>之前呼叫<code>ob_clean();</code>就可以避免這個問題 &#8230; </p>



<pre class="EnlighterJSRAW" data-enlighter-language="php" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 以上省略
ob_clean();
@readfile($file);</pre>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/10668/%e7%84%a1%e6%b3%95%e9%96%8b%e5%95%9f-php-ziparchive-%e4%b8%8b%e8%bc%89%e7%9a%84-zip-%e6%aa%94/" data-wpel-link="internal">無法開啟 PHP ZipArchive 下載的 zip 檔</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/10668/%e7%84%a1%e6%b3%95%e9%96%8b%e5%95%9f-php-ziparchive-%e4%b8%8b%e8%bc%89%e7%9a%84-zip-%e6%aa%94/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Post 後上一頁 history.back() 發生文件已到期/認重新提交表單 ERR_CACHE_MISS</title>
		<link>https://noter.tw/8538/err_cache_miss/</link>
					<comments>https://noter.tw/8538/err_cache_miss/#comments</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Sat, 05 Jun 2021 06:41:57 +0000</pubDate>
				<category><![CDATA[網頁後端]]></category>
		<category><![CDATA[網頁前端]]></category>
		<category><![CDATA[history.back()]]></category>
		<category><![CDATA[送出表單]]></category>
		<category><![CDATA[重新提交表單]]></category>
		<category><![CDATA[上一頁]]></category>
		<category><![CDATA[文件已過期]]></category>
		<category><![CDATA[重新導向]]></category>
		<category><![CDATA[Cache-Control]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[JSP]]></category>
		<category><![CDATA[ERR_CACHE_MISS]]></category>
		<guid isPermaLink="false">https://noter.tw/?p=8538</guid>

					<description><![CDATA[<p>原本可以正常使用的系統裡，經過資安調整之後出現了 ERR_CACHE_MISS 的問題，記錄一下解決的方法。 平常瀏覽網頁的時候也會遇到，當送出表單後，點選「上一頁」常可以看到文件已過期，或是重新傳送&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/8538/err_cache_miss/" data-wpel-link="internal">Post 後上一頁 history.back() 發生文件已到期/認重新提交表單 ERR_CACHE_MISS</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>原本可以正常使用的系統裡，經過資安調整之後出現了 ERR_CACHE_MISS 的問題，記錄一下解決的方法。</p>



<span id="more-8538"></span>



<p class="withcode">平常瀏覽網頁的時候也會遇到，當送出表單後，點選「上一頁」常可以看到文件已過期，或是重新傳送這些資料才可以正確顯示之類的錯誤訊息，記得以前會看到<code>ERR_CACHE_MISS</code>錯誤的字樣，小蛙這次遇到的只有顯示如下圖</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://lh3.googleusercontent.com/pw/ACtC-3eSvPTbFIORBjFcpEsPvn90wGzIaXNUCrp25i3s9QSent9yf6064q3zx3R1JpHozzATD2LhTwU1_d3al4waPQ5RX7JAmDlMN2Nf7eo-xfyuYanrDOQk5Aw-T6GKADAvVyk6SclvZGi7YVpD79o8o_lA7Q=w1314-h650-no?authuser=2" alt="ACtC 3eSvPTbFIORBjFcpEsPvn90wGzIaXNUCrp25i3s9QSent9yf6064q3zx3R1JpHozzATD2LhTwU1 d3al4waPQ5RX7JAmDlMN2Nf7eo xfyuYanrDOQk5Aw T6GKADAvVyk6SclvZGi7YVpD79o8o lA7Q=w1314 h650 no?authuser=2 Post 後上一頁 history.back() 發生文件已到期/認重新提交表單 ERR_CACHE_MISS" title="Post 後上一頁 history.back() 發生文件已到期/認重新提交表單 ERR_CACHE_MISS"><figcaption>Chrome 錯誤訊息：這個網頁需要使用你先前輸入的資料才能正確顯示。你可以重新傳送這些資料，不過這麼做會重複執行這個網頁先前執行過的任何動作。 (ERR_CACHE_MISS)</figcaption></figure>



<figure class="wp-block-image size-large"><img decoding="async" src="https://lh3.googleusercontent.com/pw/ACtC-3f_qjJrM_VT4J6DVmyBUA8UnC4f3AzMssF_Ctxux1nsRzdsxZXI0prLeuH-01YNoQ3WYgIpG-BzUYaeDt3unvCruWrxGTIOnzNOcr3eynoV4gRC84NUQCEhzWcUTyRtEdBwsgZQn02TmqZD1j9-lkS8Cg=w826-h494-no?authuser=2" alt="ACtC 3f qjJrM VT4J6DVmyBUA8UnC4f3AzMssF Ctxux1nsRzdsxZXI0prLeuH 01YNoQ3WYgIpG BzUYaeDt3unvCruWrxGTIOnzNOcr3eynoV4gRC84NUQCEhzWcUTyRtEdBwsgZQn02TmqZD1j9 lkS8Cg=w826 h494 no?authuser=2 Post 後上一頁 history.back() 發生文件已到期/認重新提交表單 ERR_CACHE_MISS" title="Post 後上一頁 history.back() 發生文件已到期/認重新提交表單 ERR_CACHE_MISS"><figcaption>Firefox 錯誤訊息：文件已過期 此文件已不存在。您所請求的文件已不存在於 Firefox 的快取當中。為了您的安全，Firefox 將不會自動重新請求敏感文件。請點下重試以重新向網站請求取得文件。(ERR_CACHE_MISS)</figcaption></figure>



<p class="withcode">小蛙接手處理的這個系統則是原本點選上一頁沒有問題，經過資安掃描修正後發生的，Google 及跟處理過該狀況的同事討論過之後找到相同的答案，如果在 header 中加入<code>Cache-Control: private</code>的設定，就可以解決掉這個問題！</p>



<h2 class="para wp-block-heading">PHP</h2>



<pre class="wp-block-preformatted withcode">// 在 session_start(); 後加入
header("Cache-Control:private");</pre>



<h2 class="para wp-block-heading">JSP</h2>



<pre class="wp-block-preformatted withcode">response.setHeader("Cache-Control", "private");</pre>



<p>參考資料：</p>



<ul class="my-li bg-darkblue wp-block-list"><li>Chrome浏览器对于POST页面执行history.back返回或表单数据丢失的解决办法<br>(連結失效 https://www.unixso.com/Php/post-header.html)</li><li><a href="https://blog.csdn.net/A9925/article/details/42027229" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">ERR_CACHE_MISS 搜尋回上一頁空白或錯誤<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li><li><a href="https://www.cnblogs.com/houdj/p/9685571.html" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">ERR_CACHE_MISS 上一页提示确认重新提交表单<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/8538/err_cache_miss/" data-wpel-link="internal">Post 後上一頁 history.back() 發生文件已到期/認重新提交表單 ERR_CACHE_MISS</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/8538/err_cache_miss/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress 利用鉤子(Hooks)清除頁面快取</title>
		<link>https://noter.tw/6888/wordpress-%e5%88%a9%e7%94%a8%e9%89%a4%e5%ad%90hooks%e6%b8%85%e9%99%a4%e9%a0%81%e9%9d%a2%e5%bf%ab%e5%8f%96/</link>
					<comments>https://noter.tw/6888/wordpress-%e5%88%a9%e7%94%a8%e9%89%a4%e5%ad%90hooks%e6%b8%85%e9%99%a4%e9%a0%81%e9%9d%a2%e5%bf%ab%e5%8f%96/#comments</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Sun, 29 Dec 2019 09:55:15 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[網頁後端]]></category>
		<category><![CDATA[觸發]]></category>
		<category><![CDATA[程式]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[add_action]]></category>
		<category><![CDATA[wp_head]]></category>
		<category><![CDATA[transition_post_status]]></category>
		<category><![CDATA[教學]]></category>
		<category><![CDATA[comment_post]]></category>
		<category><![CDATA[分享]]></category>
		<category><![CDATA[hooks]]></category>
		<category><![CDATA[鉤子]]></category>
		<category><![CDATA[清除快取]]></category>
		<category><![CDATA[更新文章]]></category>
		<guid isPermaLink="false">https://noter.tw/?p=6888</guid>

					<description><![CDATA[<p>記下來由於有使用快取的緣故，常常發文或有網友留言後頁面都不會更新，對於小蛙常常要測試修改一些東西的時候被快取誤導 Orz &#8230; 這篇記錄一下怎麼用 WordPress 內建的鉤子來解決這件事&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/6888/wordpress-%e5%88%a9%e7%94%a8%e9%89%a4%e5%ad%90hooks%e6%b8%85%e9%99%a4%e9%a0%81%e9%9d%a2%e5%bf%ab%e5%8f%96/" data-wpel-link="internal">WordPress 利用鉤子(Hooks)清除頁面快取</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>記下來由於有使用快取的緣故，常常發文或有網友留言後頁面都不會更新，對於小蛙常常要測試修改一些東西的時候被快取誤導 Orz &#8230; 這篇記錄一下怎麼用 WordPress 內建的鉤子來解決這件事情。</p>



<span id="more-6888"></span>



<p>有興趣了解更多的網友可以到 <a rel="noreferrer noopener nofollow external" aria-label="WordPress的Hook機制與原理 (在新分頁中開啟)" href="https://audilu.com/2011/10/10/wordpress-hook/" target="_blank" data-wpel-link="external" class="wpel-icon-right">WordPress的Hook機制與原理<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 看看，小蛙直接進主題。</p>



<h2 class="wp-block-heading">什麼是鉤子（hooks）</h2>



<p>WordPress 有一種叫做鉤子的機制，在某些情況或條件發生的時候，去「鉤」起一連串相關要處理的功能，<a rel="noreferrer noopener nofollow external" aria-label="List of all WordPress hooks (在新分頁中開啟)" href="https://adambrown.info/p/wp_hooks/hook" target="_blank" data-wpel-link="external" class="wpel-icon-right">List of all WordPress hooks<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 可以看到所有的鉤子列表。以上面的文章舉例，WordPress 載入網頁的時候會呼叫一個 wp_head() 來載入相對應 html head 的部份，如果我們希望在執行 wp_head 的時候額外多做一些事情，就可以在佈景主題下的 functions.php 加入</p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">add_action('wp_head', 'extra_act');
function  extra_act () {
   ... 要做的事情放在這裡 ...
} </pre>



<p>透過 add_action 來告訴 WordPress 說，當你執行到 wp_head 的時候，我要多掛上一件叫做 extra_act 的事情麻煩你一起處理，在 Drupal 也同樣存在 Hooks 的概念。知道鉤子是幹嘛的之後，就可以開始進行我們要做的事情了。</p>



<h2 class="wp-block-heading">查找能用的鉤子</h2>



<p>從 <a rel="noreferrer noopener nofollow external" href="https://adambrown.info/p/wp_hooks/hook" target="_blank" data-wpel-link="external" class="wpel-icon-right">List of all WordPress hooks<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 可以查到可以用的鉤子，小蛙要的功能是當使用者留言之後，及小蛙的文章有變動的時候，把 pagespeed module 及 php 的快取清除，開始來找跟留言及文章變動有關的鉤子。</p>



<p class="withcode pink-solid">小蛙找到 <code>transition_post_status</code> 及 <code>comment_post</code> 這兩個鉤子，看起來符合需求，開始加工需要的功能</p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">// 加入文章狀態改變的鉤子
add_action('transition_post_status', 'post_changed');
function post_changed($new_status, $old_status=null, $post=null) {
    if('publish' == $new_status || 'publish' == $old_status){
        // 清除快取，小蛙是用 shell_exec 執行系統指令
    }
}</pre>



<p>文章新狀態是 &#8220;發布&#8221; 的情況下，以及舊狀態是 &#8220;發布&#8221; 的情況下才做清除快取，帶入到實際狀況就是文章從所有狀態轉成 &#8220;發布&#8221;，表示新發文章（無論從垃圾桶叫回來、草稿發布 &#8230;）都會符合新狀態為 &#8220;發布&#8221; 的情況。而舊狀態為 &#8220;發布&#8221; 的情況則是原本已發布的網頁，刪除或是轉換回草稿，都會符合舊狀態為 &#8220;發布&#8221; 的條件。</p>



<p>訪客留言部份程式碼如下，只要有新的留言進來，就會執行清除快取，讓留言的使用者可以馬上看到剛剛的留言～</p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">add_action('comment_post', 'comment_posted');
function comment_posted() {
     // 清除快取，小蛙是用 shell_exec 執行系統指令 
}</pre>



<p>到這邊就完成小蛙的需求囉！留個記錄給有需要的人～</p>



<p><strong>WordPress 5.0 系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/446/wordpress-升級-5-0/" data-wpel-link="internal">WordPress 升級 5.0</a></li><li><a href="https://noter.tw/552/wordpress-5-0-區塊基本使用/" data-wpel-link="internal">WordPress 5.0 區塊基本使用</a></li><li><a href="https://noter.tw/569/wordpress-5-0-相關問題/" data-wpel-link="internal">WordPress 5.0 相關問題</a></li><li><a href="https://noter.tw/4262/%E5%BC%B7%E5%8C%96-wordpress-%E6%90%9C%E5%B0%8B%E5%8A%9F%E8%83%BD-search-filter-toolset-types/" data-wpel-link="internal">強化 WordPress 搜尋功能 – Search &amp; Filter + Toolset Types</a></li><li><a href="https://noter.tw/6888/wordpress-利用鉤子(hooks)清除頁面快取/" data-wpel-link="internal">WordPress 利用鉤子(Hooks)清除頁面快取</a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/6888/wordpress-%e5%88%a9%e7%94%a8%e9%89%a4%e5%ad%90hooks%e6%b8%85%e9%99%a4%e9%a0%81%e9%9d%a2%e5%bf%ab%e5%8f%96/" data-wpel-link="internal">WordPress 利用鉤子(Hooks)清除頁面快取</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/6888/wordpress-%e5%88%a9%e7%94%a8%e9%89%a4%e5%ad%90hooks%e6%b8%85%e9%99%a4%e9%a0%81%e9%9d%a2%e5%bf%ab%e5%8f%96/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>PHP 串接 AlipayHK 踩坑記錄</title>
		<link>https://noter.tw/5445/php-%e4%b8%b2%e6%8e%a5-alipayhk-%e8%b8%a9%e5%9d%91%e8%a8%98%e9%8c%84/</link>
					<comments>https://noter.tw/5445/php-%e4%b8%b2%e6%8e%a5-alipayhk-%e8%b8%a9%e5%9d%91%e8%a8%98%e9%8c%84/#comments</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Fri, 23 Aug 2019 14:47:58 +0000</pubDate>
				<category><![CDATA[網頁後端]]></category>
		<category><![CDATA[沙箱]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[2019]]></category>
		<category><![CDATA[支付寶]]></category>
		<category><![CDATA[Alipay]]></category>
		<category><![CDATA[AlipayHK]]></category>
		<category><![CDATA[串金流]]></category>
		<category><![CDATA[第三方金流]]></category>
		<guid isPermaLink="false">https://noter.tw/?p=5445</guid>

					<description><![CDATA[<p>最近幫朋友串接 AlipayHK，一開始根本這什麼東西都不知道，只大概知道是串金流、支付寶，串接的過程真是千辛萬苦，這邊記錄下來給有需要的人。 AlipayHK？支付寶？ 根據【教學】Alipay H&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/5445/php-%e4%b8%b2%e6%8e%a5-alipayhk-%e8%b8%a9%e5%9d%91%e8%a8%98%e9%8c%84/" data-wpel-link="internal">PHP 串接 AlipayHK 踩坑記錄</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>最近幫朋友串接 AlipayHK，一開始根本這什麼東西都不知道，只大概知道是串金流、支付寶，串接的過程真是千辛萬苦，這邊記錄下來給有需要的人。</p>



<span id="more-5445"></span>



<h2 class="para wp-block-heading">AlipayHK？支付寶？</h2>



<p>根據<a rel="noreferrer noopener nofollow external" aria-label=" (在新分頁中開啟)" href="https://unwire.hk/2018/07/10/alipay-hk/life-tech/epayment/" target="_blank" data-wpel-link="external" class="wpel-icon-right">【教學】Alipay HK vs 支付寶中國版　常見香港用家 3 大錯誤<span class="wpel-icon wpel-image wpel-icon-6"></span></a>，大概就像是香港版的支付寶，文章內提到</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p> Alipay HK 跟「支付寶」的區別<br>如以上所說 Alipay HK 及支付寶中國版是兩套獨立的系統，就連 APP 也是兩個不同的版本。Alipay HK 是獨立的本地公司，方便為香港度身訂造各種不同的優惠及使用方法。 </p></blockquote>



<p>好，小蛙了解自己要串的東西是「香港版支付寶」後，開始吧！朋友 email 一些「線索」來：</p>



<ul class="my-li bg-darkblue wp-block-list"><li>Alipay Global Portal:  https://globalprod.alipay.com/login/global.htm </li><li>Account Name (PID Email):</li><li>Default Login Password:</li><li>Default Payment Password:</li><li>AlipayHK &#8211; PC2Mobile: https://global.alipay.com/doc/website_hk/intro</li><li>Sandbox Guideline: http://offsite.dev-codpayment.com/sandbox_app/AlipayHK_Sandbox_Account.pdf</li><li>Sandbox APP Download Link: https://offsite.dev-codpayment.com/sandbox_app/sandboxapp.pdf</li></ul>



<p>不知道是支付寶網站改版還是怎樣，很多查到的資料或是連結，都沒有辦法連到正確的網頁，連照著教學文件都面臨找不到選單或位置的窘境，真的是花了很多冤枉時間，估計如果沒有寫下這篇，三天後小蛙又忘記怎麼連到對應的頁面或功能了。</p>



<h2 class="para wp-block-heading">準備密鑰</h2>



<p>首先一開始登入的頁面就怪怪的，從上面連結進去登入完之後，卻轉到<a rel="noreferrer noopener nofollow external" aria-label="這個頁面 (在新分頁中開啟)" href="https://global.alipay.com/ilogin/account_login.htm" target="_blank" data-wpel-link="external" class="wpel-icon-right">這個頁面<span class="wpel-icon wpel-image wpel-icon-6"></span></a>要再登入一次，嗯，也許是新舊首頁，就再登入一次吧！登入完之後，下面有兩個選項，Online Payment / In-store Payment 跟 Global Merchant Portal，好，看完敘述也不是很了解，不過「線上付款」選左邊的看看。</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="https://lh3.googleusercontent.com/czX97PHX8kx__VDxgDc57iKexCHZdrvf_rS73jjf18-n3BqTISSt-9O0iekNmpjGh2GtBrk3X8bbAEzzrV3Q6ISqLpBtRE9TzZSIBJdOFx9CpC1WWEOVskh7n5J3yRtKChASZev6xsR6Odg0wDI1IHhIJa6vggxpVaz5Wn3_G9sP6biV_BaJUiC7o1Z4aHyI4aT_bJZa50IrIU3ZhyaeolwM45hx3nZ0SghdnKWBscOlNGWwPjk6zRekWVC13fpfFtqw8fErnjk8zWm5d3TCWmjtjFznreDtgMgsmP2YhF3tkkzTU8mXQqPNONys4mK9agnxCnTp1QEcNRDfRuQ26pnnMeBFK_jQFvpUszChKNRJyvJP5cGeCOx_I6vj4wv22oJHEMmQAL6hZybwW8BaZjJwg_m0a0f_Ht6SiL-V6beQtFpYJtRO-jCMNZibdP5q-AXhsr78ihPmL_ybs9Q6Lna2YNRcxrc3z8_8ppkeCydSkogsclWLd5iQsdvpSHX34dDC82fru70SXtACAbXu0NbQLvEXrTTmaWTCawQeTyb4vV6KbLRud33RF9OkyrDY6qAEbQ1xSKSZgimobkQs4om3SySIeJO6FYzI1nDOKpd345WLCGfNF2dINbq1EbBVTgnwbsnvS9AGG-v0B4eOzBRFUzNRkUaOMQ1tB2y8XBQIi1bfcW-rZ-u1X_E9xUDt5cNGyl6JEV3BoSLg2Oz0PFBAwQ=w1196-h288-no" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external"><img decoding="async" src="https://lh3.googleusercontent.com/czX97PHX8kx__VDxgDc57iKexCHZdrvf_rS73jjf18-n3BqTISSt-9O0iekNmpjGh2GtBrk3X8bbAEzzrV3Q6ISqLpBtRE9TzZSIBJdOFx9CpC1WWEOVskh7n5J3yRtKChASZev6xsR6Odg0wDI1IHhIJa6vggxpVaz5Wn3_G9sP6biV_BaJUiC7o1Z4aHyI4aT_bJZa50IrIU3ZhyaeolwM45hx3nZ0SghdnKWBscOlNGWwPjk6zRekWVC13fpfFtqw8fErnjk8zWm5d3TCWmjtjFznreDtgMgsmP2YhF3tkkzTU8mXQqPNONys4mK9agnxCnTp1QEcNRDfRuQ26pnnMeBFK_jQFvpUszChKNRJyvJP5cGeCOx_I6vj4wv22oJHEMmQAL6hZybwW8BaZjJwg_m0a0f_Ht6SiL-V6beQtFpYJtRO-jCMNZibdP5q-AXhsr78ihPmL_ybs9Q6Lna2YNRcxrc3z8_8ppkeCydSkogsclWLd5iQsdvpSHX34dDC82fru70SXtACAbXu0NbQLvEXrTTmaWTCawQeTyb4vV6KbLRud33RF9OkyrDY6qAEbQ1xSKSZgimobkQs4om3SySIeJO6FYzI1nDOKpd345WLCGfNF2dINbq1EbBVTgnwbsnvS9AGG-v0B4eOzBRFUzNRkUaOMQ1tB2y8XBQIi1bfcW-rZ-u1X_E9xUDt5cNGyl6JEV3BoSLg2Oz0PFBAwQ=w1196-h288-no" alt="czX97PHX8kx VDxgDc57iKexCHZdrvf rS73jjf18 n3BqTISSt 9O0iekNmpjGh2GtBrk3X8bbAEzzrV3Q6ISqLpBtRE9TzZSIBJdOFx9CpC1WWEOVskh7n5J3yRtKChASZev6xsR6Odg0wDI1IHhIJa6vggxpVaz5Wn3 G9sP6biV BaJUiC7o1Z4aHyI4aT bJZa50IrIU3ZhyaeolwM45hx3nZ0SghdnKWBscOlNGWwPjk6zRekWVC13fpfFtqw8fErnjk8zWm5d3TCWmjtjFznreDtgMgsmP2YhF3tkkzTU8mXQqPNONys4mK9agnxCnTp1QEcNRDfRuQ26pnnMeBFK jQFvpUszChKNRJyvJP5cGeCOx I6vj4wv22oJHEMmQAL6hZybwW8BaZjJwg m0a0f Ht6SiL V6beQtFpYJtRO jCMNZibdP5q AXhsr78ihPmL ybs9Q6Lna2YNRcxrc3z8 8ppkeCydSkogsclWLd5iQsdvpSHX34dDC82fru70SXtACAbXu0NbQLvEXrTTmaWTCawQeTyb4vV6KbLRud33RF9OkyrDY6qAEbQ1xSKSZgimobkQs4om3SySIeJO6FYzI1nDOKpd345WLCGfNF2dINbq1EbBVTgnwbsnvS9AGG v0B4eOzBRFUzNRkUaOMQ1tB2y8XBQIi1bfcW rZ u1X E9xUDt5cNGyl6JEV3BoSLg2Oz0PFBAwQ=w1196 h288 no PHP 串接 AlipayHK 踩坑記錄" title="PHP 串接 AlipayHK 踩坑記錄"></a></figure></div>



<p>AlipayHK 簽署的方式有兩種</p>



<ul class="my-li bg-darkblue wp-block-list"><li>使用 md5 </li><li>使用 RSA / DSA</li></ul>



<p>後台介面就有 md5 的私鑰，小蛙直接使用這種方式，比較方便。進到管理頁面，切換到「My Technical Service」後右邊有「See Partner ID(PID)」跟「See Key」，先把 PID 跟 Key 記起來，等一下串接會用到。 </p>



<div class="wp-block-image"><figure class="aligncenter"><a class="" href="https://lh3.googleusercontent.com/oBX3nQoz-lsn-nO6zOExqEB8BMi3WCXoOtKPQryobihacmr6-KlyCoQirK71Kx5HLNVo8-e8qW-vsgIMD3PKZK_36a5uCi8ffxcHLvJSTOwS_il73Z8F8TX7QbkPH8CeYEN8X9K5SCPxRjgVp8n5NEu5ZkHjkLK61H4qMJySeVbV3kSUw_PoR8xQbfBt_EKxm2oiZspjvt2AssXUnd_WFe3Ec-n9Ic6hH-MrJujmZ2TlO5_umUV9eqDOXzlIBMJjwD68soPnJ8dur9ayqRpSpaLWT1CkqJXE6YC4H7BBwtXFQsfDu-g_dez4t4dafQsKvA46HOtEGCR7niWw5w3cS5TCuI4N1re5LfwarPThNUIy2ZDzHT8U0TYMwsdeGmncMWX03DRJ4h0yK3VOkFQHjnzAIgd07extjcO1he-3ewwgl3xqntsmij8Y_j6pjgUIsFmG3GJSYVCONCA_hT66sMpiyzhYqUplMutxuPceUA_aLT8Ffk2FRDjWTNkw3oDnejODKwomwV431yrTHZYPNbv-dykOT6uoB5Hvs-vcCsNkSzr6GyjXRzwRHTwRpKVVl0kccFyoTTrYH111JZEStkzR07QTgA9vApBLksGO91NgI8VuBFHU-JNmyHNBSfeIL4iJ7j08Xu_12SyBznazZkVIj8TtWr5EqjSRZC0UKOiQj-R8Y82wQNw7O8dffBhTs9yJ06qab91ZuhI4zRU5gj1PtA=w701-h376-no" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external"><img decoding="async" src="https://lh3.googleusercontent.com/oBX3nQoz-lsn-nO6zOExqEB8BMi3WCXoOtKPQryobihacmr6-KlyCoQirK71Kx5HLNVo8-e8qW-vsgIMD3PKZK_36a5uCi8ffxcHLvJSTOwS_il73Z8F8TX7QbkPH8CeYEN8X9K5SCPxRjgVp8n5NEu5ZkHjkLK61H4qMJySeVbV3kSUw_PoR8xQbfBt_EKxm2oiZspjvt2AssXUnd_WFe3Ec-n9Ic6hH-MrJujmZ2TlO5_umUV9eqDOXzlIBMJjwD68soPnJ8dur9ayqRpSpaLWT1CkqJXE6YC4H7BBwtXFQsfDu-g_dez4t4dafQsKvA46HOtEGCR7niWw5w3cS5TCuI4N1re5LfwarPThNUIy2ZDzHT8U0TYMwsdeGmncMWX03DRJ4h0yK3VOkFQHjnzAIgd07extjcO1he-3ewwgl3xqntsmij8Y_j6pjgUIsFmG3GJSYVCONCA_hT66sMpiyzhYqUplMutxuPceUA_aLT8Ffk2FRDjWTNkw3oDnejODKwomwV431yrTHZYPNbv-dykOT6uoB5Hvs-vcCsNkSzr6GyjXRzwRHTwRpKVVl0kccFyoTTrYH111JZEStkzR07QTgA9vApBLksGO91NgI8VuBFHU-JNmyHNBSfeIL4iJ7j08Xu_12SyBznazZkVIj8TtWr5EqjSRZC0UKOiQj-R8Y82wQNw7O8dffBhTs9yJ06qab91ZuhI4zRU5gj1PtA=w701-h376-no" alt="oBX3nQoz lsn nO6zOExqEB8BMi3WCXoOtKPQryobihacmr6 KlyCoQirK71Kx5HLNVo8 e8qW vsgIMD3PKZK 36a5uCi8ffxcHLvJSTOwS il73Z8F8TX7QbkPH8CeYEN8X9K5SCPxRjgVp8n5NEu5ZkHjkLK61H4qMJySeVbV3kSUw PoR8xQbfBt EKxm2oiZspjvt2AssXUnd WFe3Ec n9Ic6hH MrJujmZ2TlO5 umUV9eqDOXzlIBMJjwD68soPnJ8dur9ayqRpSpaLWT1CkqJXE6YC4H7BBwtXFQsfDu g dez4t4dafQsKvA46HOtEGCR7niWw5w3cS5TCuI4N1re5LfwarPThNUIy2ZDzHT8U0TYMwsdeGmncMWX03DRJ4h0yK3VOkFQHjnzAIgd07extjcO1he 3ewwgl3xqntsmij8Y j6pjgUIsFmG3GJSYVCONCA hT66sMpiyzhYqUplMutxuPceUA aLT8Ffk2FRDjWTNkw3oDnejODKwomwV431yrTHZYPNbv dykOT6uoB5Hvs vcCsNkSzr6GyjXRzwRHTwRpKVVl0kccFyoTTrYH111JZEStkzR07QTgA9vApBLksGO91NgI8VuBFHU JNmyHNBSfeIL4iJ7j08Xu 12SyBznazZkVIj8TtWr5EqjSRZC0UKOiQj R8Y82wQNw7O8dffBhTs9yJ06qab91ZuhI4zRU5gj1PtA=w701 h376 no PHP 串接 AlipayHK 踩坑記錄" title="PHP 串接 AlipayHK 踩坑記錄"></a></figure></div>



<p>小蛙從來沒有用過支付寶及其相關產品，<a rel="noreferrer noopener nofollow external" aria-label="這個頁面 (在新分頁中開啟)" href="https://global.alipay.com/open/product-detail.htm?bizCode=OPEN_ONLINE_PAYMENT-Website" target="_blank" data-wpel-link="external" class="wpel-icon-right">這個頁面<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 下有介紹整個流程，小蛙看完才對 AlipayHK 比較有概念，到 <a rel="noreferrer noopener nofollow external" aria-label="這邊 (在新分頁中開啟)" href="https://global.alipay.com/doc/web/intro" target="_blank" data-wpel-link="external" class="wpel-icon-right">這邊<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 看說明文件吧！今天才發現有中文文檔！！！</p>



<h2 class="para wp-block-heading">下載範例</h2>



<p>小蛙是要在 PHP 環境下串接「支付功能」，到這邊<a rel="noreferrer noopener nofollow external" aria-label="下載 PHP 範例 (在新分頁中開啟)" href="https://global.alipay.com/doc/web_cn/demo" target="_blank" data-wpel-link="external" class="wpel-icon-right">下載 PHP 範例<span class="wpel-icon wpel-image wpel-icon-6"></span></a>。解壓縮之後裡面有一些比較重要的檔案：</p>



<pre class="left green">alipay.config.php</pre>



<p>這個檔案主要是環境變數上的設定，等等要修改 partner、key、notify_url 這些變數。</p>



<pre class="left green">alipayapi.php</pre>



<p>這支是搭配 index.php 送出的表單接到參數來產生 QRCode，因為小蛙付款時不需要讓使用者輸入 index.php 的內容，因此將這些的功能拉一些出來寫成 function，如此一來就可以在要付款的地方直接設定好固定及要接的參數。</p>



<pre class="left green">notify_url.php</pre>



<p>最後一支是用來接收付款成功之後的 callback，在這邊設定付款完成之後要做對應的動作。</p>



<p>小蛙改完上面這些東西之後，其實整個範例還是沒辦法動的，這後面會再提，一開始要測試範例當然沒辦法用正式的 key 及 partner id，接下來要先建立沙箱帳號，透過沙箱環境來測試付款。</p>



<h2 class="para wp-block-heading">使用沙箱測試</h2>



<p>iOS 或 Android 到 <a href="https://offsite.dev-codpayment.com/sandbox_app/sandboxapp.pdf" target="_blank" rel="noreferrer noopener nofollow external" aria-label="這邊 (在新分頁中開啟)" data-wpel-link="external" class="wpel-icon-right">這邊<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 下載沙箱 app。 </p>



<p>到 <a rel="noreferrer noopener nofollow external" aria-label="Alipay Sandbox Portal (在新分頁中開啟)" href="https://isandbox.alipaydev.com/user/intlAccountDetails.htm" target="_blank" data-wpel-link="external" class="wpel-icon-right">Alipay Sandbox Portal<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 去新建沙箱測試帳號，小蛙這次要串的是 AlipayHK，要到 Hong Kong Wallet 下面建一個 Merchant 跟一個 Buyer 來測試。</p>



<div class="wp-block-image"><figure class="aligncenter"><img decoding="async" src="https://lh3.googleusercontent.com/H7u4zCZIT1QjH3ThzsWNF4GMry85QInN_gF-T7JWtEi-Em57mHgh2wMnezZ-2XaSrd_BgzbKwX8CPp5vA6DlimhpvIw1EjY5UiG75g4rChPz1hhuk_ZN8GAXmEg967WKB-3pbfzmqBRVccFo8n2wDDzkpQMZgbqjhJE70WSfsWStuGWwCkNJTYEaQ0y4DsONEe8gozGtl35M953me8jk1Xodx5UdmKeVhKaB4rmmuNJzbuqdEIDSHbxXqHBU15s_F10cPU_ixk9qPM64mxcmlt6Sx9J_gTniU4ATthOPceotrey-D-PmSfJ8o3ytDJD2FmBPV_Rxdk1qWkZFK58r6FjFTEN4KhaAr5sFYds7nHcxjTmk-NhT55GLZTtJ4BTfSgHEWslgAmzPnkCy1FxfEoC0GZPD4VxBTdtpt46zuB9r0xHZYzH7eQhQ3cTMEi-kCeY93txY6r23fXcojkwynNDYVmqO9RmlJw2ajqyoLT88OTKvhQxTp4bpE9Q2i_k-VjETiwTeBebAwMtJQOse6u5A5tA9wAwZXnRKzGo256tT8iXnllvuxRF9NXFkf4nysR-dDJWFTmY_ZDLBz9M68prNBcQl0wYyHyAQO0asCMqscIvxCkSvgk8e6upO4jkx5lOfYY8EDRMHwn71vJYxRIY-kE91Lov82ZdLHtDgFKCV2wZK1c2hUe5ayEWJupvhwFnTqPTNBUqlG8xQXkP3BCZVky18BAtp7ZTF1ja1-WbaLMx0=w214-h332-no" alt="H7u4zCZIT1QjH3ThzsWNF4GMry85QInN gF T7JWtEi Em57mHgh2wMnezZ 2XaSrd BgzbKwX8CPp5vA6DlimhpvIw1EjY5UiG75g4rChPz1hhuk ZN8GAXmEg967WKB 3pbfzmqBRVccFo8n2wDDzkpQMZgbqjhJE70WSfsWStuGWwCkNJTYEaQ0y4DsONEe8gozGtl35M953me8jk1Xodx5UdmKeVhKaB4rmmuNJzbuqdEIDSHbxXqHBU15s F10cPU ixk9qPM64mxcmlt6Sx9J gTniU4ATthOPceotrey D PmSfJ8o3ytDJD2FmBPV Rxdk1qWkZFK58r6FjFTEN4KhaAr5sFYds7nHcxjTmk NhT55GLZTtJ4BTfSgHEWslgAmzPnkCy1FxfEoC0GZPD4VxBTdtpt46zuB9r0xHZYzH7eQhQ3cTMEi kCeY93txY6r23fXcojkwynNDYVmqO9RmlJw2ajqyoLT88OTKvhQxTp4bpE9Q2i k VjETiwTeBebAwMtJQOse6u5A5tA9wAwZXnRKzGo256tT8iXnllvuxRF9NXFkf4nysR dDJWFTmY ZDLBz9M68prNBcQl0wYyHyAQO0asCMqscIvxCkSvgk8e6upO4jkx5lOfYY8EDRMHwn71vJYxRIY kE91Lov82ZdLHtDgFKCV2wZK1c2hUe5ayEWJupvhwFnTqPTNBUqlG8xQXkP3BCZVky18BAtp7ZTF1ja1 WbaLMx0=w214 h332 no PHP 串接 AlipayHK 踩坑記錄" title="PHP 串接 AlipayHK 踩坑記錄"></figure></div>



<p>建好之後記下 Merchant 右邊的 Merchant UID\/PID 及 MD5 Signature key，記下 Buyer 的 Buyer account 及 Login password。</p>



<div class="wp-block-image"><figure class="aligncenter"><img decoding="async" src="https://lh3.googleusercontent.com/vBkCxawrgALVGEA_73AzM9Cncde5jyUbZmh5n28zTtsQ00xRR9rt28QapLTjFiLMz37PGvWwD338vo2DnaiE5X9lz49Sc0EKR-zuX9QTcxcr2NGmzyL2bIHH63de0TxjOIGZXpyya2qNmVutFGoqE9urue4xuiTmx_PVKBqRfg3k3uY-5bOw8h0EHevRkw_u-_QWKI7NjtobOpaHs2A6vf7u-z4bHnXtGovChr31nY1ZuTtYTfGY_IlHKYi3x4pOE_Ida_R5552DYT8thzf7H-eGcp6JSj5M19XK9rS61jQgBEei8scbUfSOHFBc0NOsBHcCgSw0YAD_Az0S_YiLxkLpm3RPcfwxwNtoSvEnzh_3tvxGCXoA3-lfaSKmrdjSWqBovKKYYQ-VgitqM9ECniWr_nBNGyXaUMjWb3GNLSXyU9sYomBINILUxc9v6gz7fj4_6_6qWp0B5Y0XlWOVyN_eN6lFfj3hgNjopK9btvwrdKIo-eywF5yGw5V3iQ5YssVUjSjeCraqUcw0WYCBXTv6BTFN6yGc92Bm65T5-9XHOdD9KAN1rLtUat7mhYTu0tZUNGRtDHJC2_cqBCB6Ia304UKmZGtYMoqQgxBdhA9qUdDrtaUnYwUUshObs7puFSdZwwi6OUFV6nzxIvPqCFqHoQHDzB_d6NAHCGOBB8LbfkqT2w0jFwop5l58xODY0_s1ASnwYfeKeAGtOctI5pD6B7I8k0d_C-1XBrnf3s5X7KW3=w499-h443-no" alt="vBkCxawrgALVGEA 73AzM9Cncde5jyUbZmh5n28zTtsQ00xRR9rt28QapLTjFiLMz37PGvWwD338vo2DnaiE5X9lz49Sc0EKR zuX9QTcxcr2NGmzyL2bIHH63de0TxjOIGZXpyya2qNmVutFGoqE9urue4xuiTmx PVKBqRfg3k3uY 5bOw8h0EHevRkw u QWKI7NjtobOpaHs2A6vf7u z4bHnXtGovChr31nY1ZuTtYTfGY IlHKYi3x4pOE Ida R5552DYT8thzf7H eGcp6JSj5M19XK9rS61jQgBEei8scbUfSOHFBc0NOsBHcCgSw0YAD Az0S YiLxkLpm3RPcfwxwNtoSvEnzh 3tvxGCXoA3 lfaSKmrdjSWqBovKKYYQ VgitqM9ECniWr nBNGyXaUMjWb3GNLSXyU9sYomBINILUxc9v6gz7fj4 6 6qWp0B5Y0XlWOVyN eN6lFfj3hgNjopK9btvwrdKIo eywF5yGw5V3iQ5YssVUjSjeCraqUcw0WYCBXTv6BTFN6yGc92Bm65T5 9XHOdD9KAN1rLtUat7mhYTu0tZUNGRtDHJC2 cqBCB6Ia304UKmZGtYMoqQgxBdhA9qUdDrtaUnYwUUshObs7puFSdZwwi6OUFV6nzxIvPqCFqHoQHDzB d6NAHCGOBB8LbfkqT2w0jFwop5l58xODY0 s1ASnwYfeKeAGtOctI5pD6B7I8k0d C 1XBrnf3s5X7KW3=w499 h443 no PHP 串接 AlipayHK 踩坑記錄" title="PHP 串接 AlipayHK 踩坑記錄"></figure></div>



<div class="wp-block-image"><figure class="aligncenter"><img decoding="async" src="https://lh3.googleusercontent.com/IY-w-9e7UvaY6qZDbC_INKgC1LHQLB_N5_wse8ePHZ34uVaqvRp2BWUD3w4aYhsCOwokE_k57PurT4ermxlOq-g0Up70Kcp7vx8DP3ERiMSM5gjP16lpR-r7Nuv9WfCfLp-bncb8_IQre5rl-G5xpxwA5bNfGLlqfd-oY5Wl08OhL2ApxbmleEjm0BnUYXLw0fpUTQRgI7qgWFuxSreTDrog1jebMgZNqCx4pYOyIrGqIyM-bDK1H2xeW9dzmLf8nMU_I8VxTnlRmC4N6xAsY4r9XkPo_N9zQlaFM_bkPlbDKA6Ar5M8jrRSuNt5BiNXIrsLB3qRopLC8upA1KeTCuHV__YiWblgWpOk1diEJM6eIbpEPfS9-u466hJ7yLAzZCkNAc90yAwMno6b2DEGDgWKDCh0ACew4Z4UyNPCUBmGtIqiRtsrqcAMy9NGoVnU1PNCEox6ZStnfSKkhus8r0DSSxnCT8aWObeBgdyDjX8jjZ1BpZaD1Kpc0v30SeqnSgMbO0xyLX_EAg6DzwvNBxo59N7GQLKG20mnhtBClw1Hpnj-W-jDi_f8YUf4FxejuQSvcskprcGI2M6wwzz7J0qsS_2p62lWI-lWZZEt9a3vmPonwIQQ_DoJGWQd9XGJu6nuBuKPqjtPHJXwVQzGg9s6aVHJFVpKyxVutJcd2KW0TdiJiWUL483eJ629HMZAGjioor8cEXLLtRaEokHbejLu-CtjB0-bDYymDXRxWWI3APk-=w433-h325-no" alt="IY w 9e7UvaY6qZDbC INKgC1LHQLB N5 wse8ePHZ34uVaqvRp2BWUD3w4aYhsCOwokE k57PurT4ermxlOq g0Up70Kcp7vx8DP3ERiMSM5gjP16lpR r7Nuv9WfCfLp bncb8 IQre5rl G5xpxwA5bNfGLlqfd oY5Wl08OhL2ApxbmleEjm0BnUYXLw0fpUTQRgI7qgWFuxSreTDrog1jebMgZNqCx4pYOyIrGqIyM bDK1H2xeW9dzmLf8nMU I8VxTnlRmC4N6xAsY4r9XkPo N9zQlaFM bkPlbDKA6Ar5M8jrRSuNt5BiNXIrsLB3qRopLC8upA1KeTCuHV YiWblgWpOk1diEJM6eIbpEPfS9 u466hJ7yLAzZCkNAc90yAwMno6b2DEGDgWKDCh0ACew4Z4UyNPCUBmGtIqiRtsrqcAMy9NGoVnU1PNCEox6ZStnfSKkhus8r0DSSxnCT8aWObeBgdyDjX8jjZ1BpZaD1Kpc0v30SeqnSgMbO0xyLX EAg6DzwvNBxo59N7GQLKG20mnhtBClw1Hpnj W jDi f8YUf4FxejuQSvcskprcGI2M6wwzz7J0qsS 2p62lWI lWZZEt9a3vmPonwIQQ DoJGWQd9XGJu6nuBuKPqjtPHJXwVQzGg9s6aVHJFVpKyxVutJcd2KW0TdiJiWUL483eJ629HMZAGjioor8cEXLLtRaEokHbejLu CtjB0 bDYymDXRxWWI3APk =w433 h325 no PHP 串接 AlipayHK 踩坑記錄" title="PHP 串接 AlipayHK 踩坑記錄"></figure></div>



<h2 class="para wp-block-heading">沙箱測試</h2>



<p>把上面記下來的 Merchant UID\/PID 及 MD5 Signature key 分別填入 alipay.config.php，以及修改 notify_url 位址，一定要確定這個頁面可以存取，付款完成之後 AlipayHK 會送一個 POST 過來這裡，如果無法存取會收不到付款完成通知。</p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">$alipay_config['partner']    = 'PID 填到這裡';
$alipay_config['key']        = 'MD5 Signature key 填到這裡';
$alipay_config['notify_url'] = 'https://xxxx.xxx/notify_url.php';</pre>



<p>修改完成之後連到付款首頁，https://your_domain/alipayHK/index.php，可以看到一個表單，這表單是讓人測試用的，可以測試不同參數產生的 QRCode，送出之後會送到 alipayapi.php。</p>



<h2 class="para wp-block-heading">等等，跳出一堆錯誤訊息</h2>



<p>小蛙記得有兩三個問題，這範例程式有點不是很嚴謹 &#8230;</p>



<ul class="my-li bg-darkblue wp-block-list"><li>alipayapi.php 這支的第 73 行就出現一個奇怪符號，刪掉就好了。 </li><li>notify_url.php 這支的第 23 行，註解符號沒有放好。</li></ul>



<p>還有一個最後再說吧～最後一個也是小蛙花了最多時間去找出來的，修正完上面兩個錯誤後，應該這個範例程式就能運行了。</p>



<h2 class="para wp-block-heading">測試流程</h2>



<p>連到 https://your_domain/alipayHK/index.php 會看到以下畫面</p>



<div class="wp-block-image"><figure class="aligncenter"><img decoding="async" src="https://lh3.googleusercontent.com/gJs9q5gOdKzjqNglw41sdBTLZ9s7vUVqCR0WgHNv-xJjFOtXhosfkxJVTKG3_et8OPGCuvWfq3eco-pV2ImqU31FV7b9JVwWcYlnjUaFMdmQCGM78OiHWbdZl7KLJTSu9FGuhQBxtIwOfkHYXSgbKBx-dSg4q9vH9HnaKzJHZ1A7p5tHfAB1MqxLXEKRJgtrH3iA1yjolctFswrDJqsGO4-SADwxXwMMMl8LYzhZU-HKxMuzXwtJPq-1ReknYUWT2tr5kNiF7qpRjcAk3glWDh2P5TBZJRjH5SUzUc0EUic1j-orhH8t8lWhdARCq4WsWUQ7B0Uycv_tRefEtDWVQw7lGtDvImuSur3hl3ETF2OrZ_XFdhYFJ-VV4txPPG4vtylJhzlz-pRF5uozgBY3ec5_SvnryGlIlAgAHQfLLGiV_sPM1iBDlcdtSM9BVcWGp_k9Dy3mF4-uVhM_bNCUCq5RJCU7GHut89Pj3waQ4FEHpdfd1b4r3SlhPw-fJZTqqgUZHgQHEFvA2pmzXpTIqjARzPC0BunK6V7cGtpCy1K3AMNEr51UsiCEQ4n3TArvnwbWU-KCsSqpFQM4UnYbxSwBWZuE2OtCmsZVdbieI8n2QCCPQMCrDm9BOEe0FNZim6O9f248QkP751WuLGImTgxjN7ARgcP4ZlCsewkODci-WV_Z9-xsOVcRoUjVxXp2iiTjeht8fXz3_s4RRUdEwrh6EX5zz3_H16rVcdUye1NDSQ9N=w825-h999-no" alt="gJs9q5gOdKzjqNglw41sdBTLZ9s7vUVqCR0WgHNv xJjFOtXhosfkxJVTKG3 et8OPGCuvWfq3eco pV2ImqU31FV7b9JVwWcYlnjUaFMdmQCGM78OiHWbdZl7KLJTSu9FGuhQBxtIwOfkHYXSgbKBx dSg4q9vH9HnaKzJHZ1A7p5tHfAB1MqxLXEKRJgtrH3iA1yjolctFswrDJqsGO4 SADwxXwMMMl8LYzhZU HKxMuzXwtJPq 1ReknYUWT2tr5kNiF7qpRjcAk3glWDh2P5TBZJRjH5SUzUc0EUic1j orhH8t8lWhdARCq4WsWUQ7B0Uycv tRefEtDWVQw7lGtDvImuSur3hl3ETF2OrZ XFdhYFJ VV4txPPG4vtylJhzlz pRF5uozgBY3ec5 SvnryGlIlAgAHQfLLGiV sPM1iBDlcdtSM9BVcWGp k9Dy3mF4 uVhM bNCUCq5RJCU7GHut89Pj3waQ4FEHpdfd1b4r3SlhPw fJZTqqgUZHgQHEFvA2pmzXpTIqjARzPC0BunK6V7cGtpCy1K3AMNEr51UsiCEQ4n3TArvnwbWU KCsSqpFQM4UnYbxSwBWZuE2OtCmsZVdbieI8n2QCCPQMCrDm9BOEe0FNZim6O9f248QkP751WuLGImTgxjN7ARgcP4ZlCsewkODci WV Z9 xsOVcRoUjVxXp2iiTjeht8fXz3 s4RRUdEwrh6EX5zz3 H16rVcdUye1NDSQ9N=w825 h999 no PHP 串接 AlipayHK 踩坑記錄" title="PHP 串接 AlipayHK 踩坑記錄"></figure></div>



<p>直接按 Play 後會產生 QRCode</p>



<div class="wp-block-image"><figure class="aligncenter"><img decoding="async" src="https://lh3.googleusercontent.com/DCmiHnQIp2jzdwWtcmZI-cnrjPodRBxaRbEn2LAq-bYH6UQVepA7vIGl77oxQ734rbGXSFswRZMzwdV2Z8CQvKucHpxSHJ4GE_NbnHvhV2nXxbTTHH9VuJYDOZyyqcPGkdeTS0ot1GZRK3D4cS-800xWUONbBjbh1IXw7AsLN0COoyvlBY_WUJuz9Xa2nD4Wk9WPenbgTch9ZdHnON3hmAZh5yeRiCQ_MSGldEKf42gUx3dGu8533b8kzNZ2njyz8WduUjDs5jZsv5Vw3zgMSi6X6ll-IA2wx8S9JjGYeFAWz6iZ3V6WlIC0zDiXYJmobeeVMjyJuZs_kT15YkKldEDcQklIOruVwpUYH58Hk8gKqOsEKud0QvXSjn-Nhr6D5H_e_XF16Wzhl-hLWepu6FDVZeVnNqlZksH7EC_dWnM9Udy734JSDuge3PEw07J4V5GK7SxAVR7TuBu1wgpJtEzL4fVXYt8tFblRLyo5w-IZ-HwOtqBGHJ5cvirm7cqPyNK1AGa4fR27vDPTZQTSUgTI2O9MSQQzpsfSGO3Dh7DDqv4MLYGYaX-jOFF5zF8BoyzwDwHMUqdMBMSejslfEIlIqlj1EV6FzwmdaAPWEdDQmwesJiLnBVQ3yE6IgOxFvffprxdfaQO3lDIHL7Q9E8_D32qByw-WBxOukKUrB1s2hNXJNSDpDsXa0pRdQZPSyNYMC8VyJ-GCTFVb5MMu1BoNmKjOo2vRXqI-DOKOhvgtyiiH=s201-no" alt="DCmiHnQIp2jzdwWtcmZI cnrjPodRBxaRbEn2LAq bYH6UQVepA7vIGl77oxQ734rbGXSFswRZMzwdV2Z8CQvKucHpxSHJ4GE NbnHvhV2nXxbTTHH9VuJYDOZyyqcPGkdeTS0ot1GZRK3D4cS 800xWUONbBjbh1IXw7AsLN0COoyvlBY WUJuz9Xa2nD4Wk9WPenbgTch9ZdHnON3hmAZh5yeRiCQ MSGldEKf42gUx3dGu8533b8kzNZ2njyz8WduUjDs5jZsv5Vw3zgMSi6X6ll IA2wx8S9JjGYeFAWz6iZ3V6WlIC0zDiXYJmobeeVMjyJuZs kT15YkKldEDcQklIOruVwpUYH58Hk8gKqOsEKud0QvXSjn Nhr6D5H e XF16Wzhl hLWepu6FDVZeVnNqlZksH7EC dWnM9Udy734JSDuge3PEw07J4V5GK7SxAVR7TuBu1wgpJtEzL4fVXYt8tFblRLyo5w IZ HwOtqBGHJ5cvirm7cqPyNK1AGa4fR27vDPTZQTSUgTI2O9MSQQzpsfSGO3Dh7DDqv4MLYGYaX jOFF5zF8BoyzwDwHMUqdMBMSejslfEIlIqlj1EV6FzwmdaAPWEdDQmwesJiLnBVQ3yE6IgOxFvffprxdfaQO3lDIHL7Q9E8 D32qByw WBxOukKUrB1s2hNXJNSDpDsXa0pRdQZPSyNYMC8VyJ GCTFVb5MMu1BoNmKjOo2vRXqI DOKOhvgtyiiH=s201 no PHP 串接 AlipayHK 踩坑記錄" title="PHP 串接 AlipayHK 踩坑記錄"></figure></div>



<p>用<a rel="noreferrer noopener nofollow external" aria-label="沙箱 app (在新分頁中開啟)" href="https://offsite.dev-codpayment.com/sandbox_app/sandboxapp.pdf" target="_blank" data-wpel-link="external" class="wpel-icon-right">沙箱 app<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 掃描上面的 QRCode，在用上面的 Buyer account 跟 Login password 登入進行沙箱付款，付款完成之後 AlipayHK 會 POST 資料到上面的 notify_url.php，接著做後續處理。</p>



<h2 class="para wp-block-heading">付款完成後處理</h2>



<p>最後一個動作就是讓 Sever 知道付款完成了，AlipayHK 發送一個 POST 到 notify_url.php，小蛙卡在不管怎樣回來的結果都是「驗證錯誤」，小蛙試了很久，也看了很多官方文件、其他網友分享的過程，都沒有找到解法。</p>



<p>然後小蛙就一步一步 trace code，發現通通都過了，驗證方法都一樣卻出來不一樣的東西，最後發現是這行在搞鬼 &#8230; 真不知道怎麼說，AlipayHK 都好心放出範例檔了，卻如此不嚴謹 &#8230; （也可能是小蛙自己太笨，說不定只有小蛙一個人卡在這）</p>



<p>到 alipay.config.php 裡面找到</p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">$alipay_config['cacert']    = getcwd().'\\cacert.pem'; </pre>



<p>改成</p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">$alipay_config['cacert']    = getcwd().'/cacert.pem';</pre>



<p>打完收工～</p>



<p><strong>串金流系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/5445/php-%e4%b8%b2%e6%8e%a5-alipayhk-%e8%b8%a9%e5%9d%91%e8%a8%98%e9%8c%84/" data-wpel-link="internal">PHP 串接 AlipayHK 踩坑記錄</a></li><li><a href="https://noter.tw/5539/ios-untrusted-enterprise-developer%ef%bc%8d%e4%b8%b2%e6%8e%a5-alipayhk-%e6%b2%99%e7%ae%b1%e6%b8%ac%e8%a9%a6%e5%95%8f%e9%a1%8c/" data-wpel-link="internal">iOS: Untrusted Enterprise Developer－串接 AlipayHK 沙箱測試問題</a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/5445/php-%e4%b8%b2%e6%8e%a5-alipayhk-%e8%b8%a9%e5%9d%91%e8%a8%98%e9%8c%84/" data-wpel-link="internal">PHP 串接 AlipayHK 踩坑記錄</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/5445/php-%e4%b8%b2%e6%8e%a5-alipayhk-%e8%b8%a9%e5%9d%91%e8%a8%98%e9%8c%84/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>PHP：UTF-8 跟 Big5 的糾結</title>
		<link>https://noter.tw/109/php%ef%bc%9autf-8-%e8%b7%9f-big5-%e7%9a%84%e7%b3%be%e7%b5%90/</link>
					<comments>https://noter.tw/109/php%ef%bc%9autf-8-%e8%b7%9f-big5-%e7%9a%84%e7%b3%be%e7%b5%90/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Mon, 17 Sep 2018 14:39:51 +0000</pubDate>
				<category><![CDATA[網頁後端]]></category>
		<category><![CDATA[encodeURIComponent]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[big5]]></category>
		<category><![CDATA[utf-8]]></category>
		<category><![CDATA[iconv]]></category>
		<category><![CDATA[亂碼]]></category>
		<category><![CDATA[rawurlencode]]></category>
		<guid isPermaLink="false">https://noter.tw/?p=109</guid>

					<description><![CDATA[<p>今天在公司處理到一個編碼的問題，由於有許多歷史包袱都是以 big5 下去開發，短時間內沒有辦法把所有系統轉換成 utf-8 的情況下，就經常要面對編碼轉換的問題，這邊記錄一下今天遇到問題的解法。 有個&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/109/php%ef%bc%9autf-8-%e8%b7%9f-big5-%e7%9a%84%e7%b3%be%e7%b5%90/" data-wpel-link="internal">PHP：UTF-8 跟 Big5 的糾結</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>今天在公司處理到一個編碼的問題，由於有許多歷史包袱都是以 big5 下去開發，短時間內沒有辦法把所有系統轉換成 utf-8 的情況下，就經常要面對編碼轉換的問題，這邊記錄一下今天遇到問題的解法。</p>



<span id="more-109"></span>



<p>有個新的系統 B 必須要串接舊系統 A，B 是 utf-8 環境，A 是 big5 環境，目前設計是 B 透過 AJAX 來讀取 A 的資料，A 這邊吃的是經過 encodeURIComponent 處理過的資料，例如：「你好」 -&gt;&nbsp;「%A7%41%A6%6E」，前情提要到這邊。</p>



<p>小蛙的笨腦袋就開始想怎麼處理：</p>



<ul class="my-li bg-darkblue wp-block-list"><li>該頁面拿到的資料都是 UTF-8，拿到之後用 iconv 轉 big5 先</li><li>轉成 big5 之後，再做 encodeURIComponent 就好了</li><li>easy ~</li></ul>



<p>整個串起來之後，正確的「你好」應該是「%A7%41%A6%6E」，小蛙卻得到「%EF%BF%BDA%EF%BF%BDn」，看起來好像差很大，於是想說可能是因為 php 要透過 javascript encodeURIComponent 來轉，雖然轉好 big5 但是又在 utf-8 的文本中印出導致的，於是開始往「一切都在 php 中轉好，javascript 直接拿到轉好值就丟出去」的方向進行，小蛙改變策略：</p>



<ul class="my-li bg-darkblue wp-block-list"><li>在 php 中使用 iconv 把 UTF-8 轉成 big5</li><li>在 php 中使用 <a rel="noreferrer noopener nofollow external" href="https://blog.longwin.com.tw/2015/11/php-rawurlencode-urlencode-diff-2015/" target="_blank" data-wpel-link="external" class="wpel-icon-right">rawurlencode<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 轉換</li><li>把結果透過 javascript 去要資料</li></ul>



<p>嗯，看起來應該是無懈可擊！哦哦哦哦哦哦 ~ 高興的尖叫起來，隔壁同事都看了小蛙一眼，但回傳的結果怪怪的啊，看一下後台 log，「你好」變成了「%A7A%A6n」，額外測試一個「外部」卻變成了「%A5~%B3%A1」，花惹發？嗯 ~ 港節好像比第一次得到的更接近正解一點(?)，再來想想問題在哪，重新順一下流程好了，第一步跟第二步都做轉換的動作，其中一定有一個轉換失效了，要不第一個要不第二個(廢話)。</p>



<p>Google 了一下看到這篇「<a href="http://www.edbiji.com/doccenter/showdoc/4/nav/680.html" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">php 转码函数 你还在用iconv吗？<span class="wpel-icon wpel-image wpel-icon-6"></span></a>」，既然懷疑轉換出問題，那就把他換掉看看，事情絕對沒有憨人所想的那麼簡單，結果沒變！沒變 &#8230; 記得以前有一次使用 base64 來做過這件事，正當打算要來試的時候，超猛同事走了過來問說發生什麼事，小蛙大概跟他講解了一下，他只回了一句，那你把 iconv 轉的東西印出來看就知道了。</p>



<p>看來出現新的曙光，Google 查到這篇「<a href="https://stackoverflow.com/questions/14674834/php-convert-string-to-hex-and-hex-to-string" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">PHP convert string to hex and hex to string<span class="wpel-icon wpel-image wpel-icon-6"></span></a>」，於是把 iconv 改成&nbsp;mb_convert_encoding，然後再透過該文章中的 function 來做轉換，就可以成功轉換成系統 A 需要的格式了！</p>



<p>可喜可樂！留個備份，記錄超強同事的神蹟！</p>



<h2 class="wp-block-heading">發現問題 (2018-10-16更新)</h2>



<p>上面的作法用了一段時間後發現有些字串會解析成不一樣的東西，例如：<code>帶卜辭</code>實際上收到卻變成<code>帶尸辭</code>、<code>恆春</code>變成<code>恆柢</code>、<code>小屯</code>變成<code>匕屯</code>。<br>以「帶卜辭」來當作轉換的例子<br>帶 =&gt; 「%B1a」<br>卜 =&gt; 「%A4R」<br>辭 =&gt; 「%C3%E3」</p>



<p>如果用上面的方法轉出來，轉出來會是全小寫，<br>帶 &lt;= 「%b1a」<br>尸 &lt;= 「%a4r」<br>辭 &lt;= 「%c3%e3」</p>



<p>下方是把它改成全大寫<br>婢 &lt;= 「%B1A」<br>卜 &lt;= 「%A4R」<br>辭 &lt;= 「%C3%E3」</p>



<p>但以上兩者都不對，因為原本的方法轉出來之後，就通通變成小寫，而大小寫卻對應到不一樣的字，造成這次的問題。</p>



<h2 class="wp-block-heading">使用 rawurlencode (2018-10-16更新)</h2>



<p>只要先把要轉換的文字，正確地轉到 big5 之後，透過 rawurlencode 來做編碼就可以編出正確的內容囉！</p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">// 先把要的文字轉成 big5，再整個透過 rawurlencode 轉換
$txt = rawurlencode(mb_convert_encoding($txt, "big5", "utf-8"));</pre>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/109/php%ef%bc%9autf-8-%e8%b7%9f-big5-%e7%9a%84%e7%b3%be%e7%b5%90/" data-wpel-link="internal">PHP：UTF-8 跟 Big5 的糾結</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/109/php%ef%bc%9autf-8-%e8%b7%9f-big5-%e7%9a%84%e7%b3%be%e7%b5%90/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Java / PHP 插入 emoji 資料到 MariaDB</title>
		<link>https://noter.tw/122/java-php-%e6%8f%92%e5%85%a5-emoji-%e8%b3%87%e6%96%99%e5%88%b0-mariadb/</link>
					<comments>https://noter.tw/122/java-php-%e6%8f%92%e5%85%a5-emoji-%e8%b3%87%e6%96%99%e5%88%b0-mariadb/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Thu, 28 Jun 2018 14:57:34 +0000</pubDate>
				<category><![CDATA[資料庫]]></category>
		<category><![CDATA[網頁後端]]></category>
		<category><![CDATA[characterEncoding]]></category>
		<category><![CDATA[錯誤]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[emoji]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mariadb]]></category>
		<category><![CDATA[utf8mb4]]></category>
		<category><![CDATA[useUnicode]]></category>
		<guid isPermaLink="false">https://noter.tw/?p=122</guid>

					<description><![CDATA[<p>Java 跟 PHP 新增 emoji 字串進去 MySQL / MariaDB 資料庫的時候發生錯誤？這篇可以幫助你喔！</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/122/java-php-%e6%8f%92%e5%85%a5-emoji-%e8%b3%87%e6%96%99%e5%88%b0-mariadb/" data-wpel-link="internal">Java / PHP 插入 emoji 資料到 MariaDB</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>這件事是這樣的，小蛙需要接收一個從 App 過來的表單資料，就在接收後要塞進 MariaDB 的時候，問題就出現了 &#8230;</p>
<p><span id="more-122"></span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">Error Code: 1366. Incorrect string value: '\xF0\x9F\x92\xA2' for column 'SOURCE_CONTEXT' at row 1</pre>
<p>一再檢查要塞入的字串感覺沒有什麼問題，試了好幾次之後才發現 &#8230; 原來裡面包含了 emoji 啦！！！</p>
<p>之前跟同事聊天的時候得知，如果要存 emoji 的話要把資料庫的欄位改成 utf8mb4，但是呢 &#8230; 小蛙實在不想動太多，參考資料裡有很多解法，有興趣可以去看看。</p>
<p>小蛙這邊只是把要存 emoji 的欄位改成 utf8mb4，然後 &#8230; php 一執行，還是噴一樣的錯誤出來，嗯 ~ 這個案情不單純，來慢慢 try ~</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">jdbc:mysql://ip:port/db_name?useUnicode=true&amp;characterEncoding=utf8mb4</pre>
<p>試了一些方法之後發現，在 php 的部份連線後，在做任何操作之前先執行</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">mysqli_query( $conn, "SET NAMES 'utf8mb4'");</pre>
<p>ㄟ ~ 竟然好像貌似就可以了！另一個專案需要用 Java 去剖析並塞入有 emoji 的需求，立馬試試</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">ps.executeQuery("SET NAMES 'utf8mb4'");</pre>
<p>哦哦哦哦哦哦哦哦哦哦哦哦哦 ~</p>
<p>有很多文章的教學是根本的解決方法，像是把資料庫各項設定都直接改成 utf8mb4，小蛙不想動到太多，試出這方法，最後總結一下：</p>
<ol class="my-li bg-darkblue">
<li>mysql connector 更新到新版</li>
<li>jdbc:mysql://ip:port/db_name?useUnicode=true&amp;characterEncoding=utf-8&amp;character_set_server=utf8mb4</li>
<li>建立 Statement 或 PreparedStatement 後就立馬執行 SET NAMES &#8216;utf8mb4&#8217;</li>
</ol>
<p>以上，希望幫助到有需要的人！</p>
<h2 class="para">參考資料</h2>
<ol class="my-li bg-darkblue">
<li><a href="https://stackoverflow.com/questions/44591895/utf8mb4-in-mysql-workbench-and-jdbc" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">utf8mb4 in MySQL Workbench and JDBC &#8211; Stack Overflow<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li><a href="https://stackoverflow.com/questions/46140583/caused-by-java-sql-sqlexception-unsupported-character-encoding-utf8mb4" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Caused by: java.sql.SQLException: Unsupported character encoding &#8216;utf8mb4&#8217; &#8211; Stack Overflow<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li><a href="https://stackoverflow.com/questions/47060827/jdbc-and-utf8mb4-encoding-the-emoji-symbol" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">JDBC and utf8mb4 encoding the emoji symbol ? &#8211; Stack Overflow<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li><a href="https://blog.csdn.net/sunny05296/article/details/78488366" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">mysql/Java服务端对emoji(utf8mb4编码)的支持有关的问题 &#8211; CSDN 博客<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ol>


<p><strong>MySQL / MariaDB / Oracle 相關文章：</strong></p>



<ul class="my-li bg-darkblue wp-block-list">
<li><a href="https://noter.tw/12503/mariadb-json_extract-%e5%be%9e-json-%e6%ac%84%e4%bd%8d%e5%8f%96%e5%80%bc/" data-wpel-link="internal">MariaDB JSON_EXTRACT: 從 JSON 欄位取值</a></li>



<li><a href="https://noter.tw/12015/oracle-%e5%88%86%e7%b5%84%e7%b7%a8%e8%99%9f%e8%88%87%e5%85%a8%e6%8e%92%e5%ba%8f%e7%b7%a8%e8%99%9f-row_number-over-partition-by/" data-wpel-link="internal">Oracle, MySQL 分組編號與全排序編號 row_number, over, partition by</a></li>



<li><a href="https://noter.tw/3929/mysql-error-2003-hy000-%E7%84%A1%E6%B3%95%E9%81%A0%E7%AB%AF%E9%80%A3%E7%B7%9A/" data-wpel-link="internal">MySQL ERROR 2003 (HY000) 無法遠端連線</a></li>



<li><a href="https://noter.tw/2889/jsp-%E9%80%A3%E7%B5%90-mysql/" data-wpel-link="internal">JSP 連結 MySQL</a></li>



<li><a href="https://noter.tw/2883/java-%E9%80%A3%E7%B5%90-mysql/" data-wpel-link="internal">Java 連結 MySQL</a></li>



<li><a href="https://noter.tw/2306/mysql%E6%8E%92%E7%A8%8Bevent-scheduler/" data-wpel-link="internal">MySQL 排程(Event Scheduler)</a></li>



<li><a href="https://noter.tw/1988/java%E9%80%A3%E7%B5%90%E9%81%A0%E7%AB%AFmysql/" data-wpel-link="internal">Java 連結遠端 MySQL</a></li>



<li><a href="https://noter.tw/4508/mariadb-replication-%E8%A8%AD%E5%AE%9A/" data-wpel-link="internal">MariaDB Replication 設定</a></li>



<li><a href="https://noter.tw/122/java-php-%E6%8F%92%E5%85%A5-emoji-%E8%B3%87%E6%96%99%E5%88%B0-mariadb/" data-wpel-link="internal">Java / PHP 插入 emoji 資料到 MariaDB</a></li>
</ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/122/java-php-%e6%8f%92%e5%85%a5-emoji-%e8%b3%87%e6%96%99%e5%88%b0-mariadb/" data-wpel-link="internal">Java / PHP 插入 emoji 資料到 MariaDB</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/122/java-php-%e6%8f%92%e5%85%a5-emoji-%e8%b3%87%e6%96%99%e5%88%b0-mariadb/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>調整 php 版本</title>
		<link>https://noter.tw/3970/%e8%aa%bf%e6%95%b4-php-%e7%89%88%e6%9c%ac/</link>
					<comments>https://noter.tw/3970/%e8%aa%bf%e6%95%b4-php-%e7%89%88%e6%9c%ac/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Fri, 15 Jun 2018 11:25:05 +0000</pubDate>
				<category><![CDATA[網頁後端]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Web Server]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[update-alternatives]]></category>
		<guid isPermaLink="false">https://wazai.net/?p=3970</guid>

					<description><![CDATA[<p>接續昨天處理的 swoole 編譯並且成功載入模組，今天朋友突然跟我說原本可以跑的 code 突然不能跑了 &#8230; 這就神奇了 ~~其實小蛙根本不清楚為什麼原本可以執行後來不能執行，也是因為小&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3970/%e8%aa%bf%e6%95%b4-php-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">調整 php 版本</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>接續昨天處理的 swoole 編譯並且成功載入模組，今天朋友突然跟我說原本可以跑的 code 突然不能跑了 &#8230; 這就神奇了 ~~<br /><span id="more-3970"></span><br />其實小蛙根本不清楚為什麼原本可以執行後來不能執行，也是因為小蛙裝 Ubuntu 16.04 的時候，php5.x ~ php7.x 新舊交替，每次在想要裝 5.x 還是 7.x，看著趨勢會默默跑去裝 7.x，但有些程式直上 7.x 就是噴錯給你看，例如：<a href="https://noter.tw/3913/ubuntu-16-04-phpmyadmin-deprecation-notice-with-php-7/" data-wpel-link="internal">這篇文章</a>，這實在難啊！<br />這次這個例子呢，安裝之前小蛙並沒有注意到底是用哪一個，多 php 版本的情況下感覺好像有點自找麻煩，<del>不過感覺沒道理不過是 make swoole 就把 php cli 從 5.x 變成 7.x 版本(還是真的會這樣 &#8230;?) </del>詢問了朋友，應該是有可能在 make &amp;&amp; make install 的過程中被改掉，好吧！知道問題在哪就好處理了，如果 php cli 被改掉就 &#8230; 改回來唄！<br />調整 php 版本蠻簡單的，根據 參考資料1，小蛙這邊記錄兩種自己用的方法：</p>
<h2 class="para">手動設定 php 版本 &#8211; 1</h2>
<p>如果你很明確知道 php 的執行檔放在哪個地方，直接下指令就可以切換了</p>


<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">update-alternatives --set php /usr/bin/php5.6</pre>



<h2 class="para wp-block-heading">清單挑選 php 版本 &#8211; 2</h2>



<p>第二個方法是列出所有的 php 版本，讓你可以直接用挑選的方式設定</p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">update-alternatives --config php</pre>



<h2 class="para wp-block-heading">參考資料</h2>



<ul class="my-li bg-darkblue wp-block-list"><li> <a rel="noreferrer noopener nofollow external" href="https://stackoverflow.com/questions/42619312/switch-php-versions-on-commandline-ubuntu-16-04" target="_blank" data-wpel-link="external" class="wpel-icon-right">Switch php versions on commandline ubuntu 16.04 @ Stack Overflow<span class="wpel-icon wpel-image wpel-icon-6"></span></a> </li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3970/%e8%aa%bf%e6%95%b4-php-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">調整 php 版本</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3970/%e8%aa%bf%e6%95%b4-php-%e7%89%88%e6%9c%ac/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Ubuntu 16.04 編譯並安裝 Swoole</title>
		<link>https://noter.tw/3963/ubuntu-16-04-%e7%b7%a8%e8%ad%af%e4%b8%a6%e5%ae%89%e8%a3%9d-swoole/</link>
					<comments>https://noter.tw/3963/ubuntu-16-04-%e7%b7%a8%e8%ad%af%e4%b8%a6%e5%ae%89%e8%a3%9d-swoole/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Thu, 14 Jun 2018 14:59:16 +0000</pubDate>
				<category><![CDATA[Web Server]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpize]]></category>
		<category><![CDATA[swoole]]></category>
		<guid isPermaLink="false">https://wazai.net/?p=3963</guid>

					<description><![CDATA[<p>接到一個好朋友的求救，需要在 Ubuntu 16.04 下安裝 Swoole 模組，讓 apache 更虎虎生風！第一次做這件事，記錄留個底，也許能幫到需要的人。 介紹這有什麼功能以及強項一向不是小蛙&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3963/ubuntu-16-04-%e7%b7%a8%e8%ad%af%e4%b8%a6%e5%ae%89%e8%a3%9d-swoole/" data-wpel-link="internal">Ubuntu 16.04 編譯並安裝 Swoole</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>接到一個好朋友的求救，需要在 Ubuntu 16.04 下安裝 Swoole 模組，讓 apache 更虎虎生風！第一次做這件事，記錄留個底，也許能幫到需要的人。</p>



<span id="more-3963"></span>



<p>介紹這有什麼功能以及強項一向不是小蛙的 style，這邊就是記錄怎麼把這東西安裝起來比較重要，介紹性的文章就找一些專業的介紹文來看吧！總之會來到這邊的人應該是想知道怎麼把這東西裝起來的吧！(應該吧！哈哈)</p>



<p>這個編譯過程比想像中的還要容易一些，期間沒有遇到什麼詭異的大問題，直接進入步驟吧！</p>



<h2 class="para wp-block-heading">步驟</h2>



<p>先到 <a rel="noreferrer noopener nofollow external" href="https://github.com/swoole/swoole-src/releases/tag/v2.0.10-stable" target="_blank" data-wpel-link="external" class="wpel-icon-right">參考資料1<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 下載 Source Code，小蛙下載的時候已經有 v4.0.0，但總覺得怪怪的，因此還是找了 <a rel="noreferrer noopener nofollow external" href="https://github.com/swoole/swoole-src/releases/tag/v2.0.10-stable" target="_blank" data-wpel-link="external" class="wpel-icon-right">v2.0.10-stable<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 來做比較保險，至少名稱上有個 stable，下載完後解壓縮，並進入該資料夾。</p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">wget https://github.com/swoole/swoole-src/archive/v2.0.10-stable.zip
unzip v2.0.10-stable.zip
cd swoole-src-2.0.10-stable/</pre>



<p>安裝 php-dev</p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">apt-get install php-dev</pre>



<p>執行編譯，這邊小蛙的主機上竟然沒有 make，必須要先 <code>apt-get install make</code> 來安裝 make 工具。</p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">phpize
./configure
make</pre>



<p>完成囉！</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img decoding="async" src="https://noter.tw/wp-content/uploads/2018/06/swoole_make_install.png" alt="swoole make install Ubuntu 16.04 編譯並安裝 Swoole" title="Ubuntu 16.04 編譯並安裝 Swoole"></figure></div>



<p>修改 php.ini 導入模組，小蛙使用的這版 php 跟以前那種直接去 php.ini 新增 extension=swoole.so 不太一樣，而是在安裝目錄下載入 module。</p>



<pre class="wp-block-preformatted wp-block-syntaxhighlighter-code">cd /etc/php/7.2/mods-available/
隨便複製一個 ini
cp mysqli.ini swoole.ini
vim swoole.ini
把 extension=mysqli.so 改成 extension=swoole.so
cd /etc/php/7.2/cli/conf.d/
ln -s /etc/php/7.2/mods-available/swoole.ini 20-swoole.ini
service apache2 restart
檢查是否正確安裝
php -m | grep 'swoole'</pre>



<p>目前小蛙也還在看看 swoole 能做到哪些酷炫的事情，看看是否自己的主機也要裝這個模組！</p>



<h2 class="para wp-block-heading">參考資料</h2>



<ul class="my-li bg-darkblue wp-block-list"><li><a rel="noreferrer noopener nofollow external" href="https://github.com/swoole/swoole-src/releases/tag/v2.0.10-stable" target="_blank" data-wpel-link="external" class="wpel-icon-right">Swoole @ GitHub<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3963/ubuntu-16-04-%e7%b7%a8%e8%ad%af%e4%b8%a6%e5%ae%89%e8%a3%9d-swoole/" data-wpel-link="internal">Ubuntu 16.04 編譯並安裝 Swoole</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3963/ubuntu-16-04-%e7%b7%a8%e8%ad%af%e4%b8%a6%e5%ae%89%e8%a3%9d-swoole/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)</title>
		<link>https://noter.tw/2539/%e5%9c%a8eclipse%e4%b8%8a%e9%96%8b%e7%99%bcphp%e7%a8%8b%e5%bc%8f%e4%bb%a5moodle%e3%80%81egit%e3%80%81pdt%e7%82%ba%e4%be%8b/</link>
					<comments>https://noter.tw/2539/%e5%9c%a8eclipse%e4%b8%8a%e9%96%8b%e7%99%bcphp%e7%a8%8b%e5%bc%8f%e4%bb%a5moodle%e3%80%81egit%e3%80%81pdt%e7%82%ba%e4%be%8b/#comments</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 19 Dec 2012 09:24:56 +0000</pubDate>
				<category><![CDATA[網頁後端]]></category>
		<category><![CDATA[EGit]]></category>
		<category><![CDATA[moodle]]></category>
		<category><![CDATA[PDT]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Eclipse]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=2539</guid>

					<description><![CDATA[<p>最近受命必須要研究 moodle，並且希望可以用 Eclipse 這種比較聰明的 IDE 來開發，而 moodle 本身是 PHP 寫的，之前只有使用 Eclipse 開發過 Java，這篇文章只是簡&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2539/%e5%9c%a8eclipse%e4%b8%8a%e9%96%8b%e7%99%bcphp%e7%a8%8b%e5%bc%8f%e4%bb%a5moodle%e3%80%81egit%e3%80%81pdt%e7%82%ba%e4%be%8b/" data-wpel-link="internal">在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>最近受命必須要研究 moodle，並且希望可以用 Eclipse 這種比較聰明的 IDE 來開發，而 moodle 本身是 PHP 寫的，之前只有使用 Eclipse 開發過 Java，這篇文章只是簡單記錄怎麼讓 Eclipse 可以開發 PHP 程式，並且透過 EGit 將遠端 moodle 原始碼 clone 回來！<br />
<span id="more-2539"></span></p>
<ul>
<li>
<h1><strong style="color: #000000;">環境</strong></h1>
</li>
</ul>
<p>先到 <a href="http://java.com" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://java.com<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 下載新版的 Java 執行環境。Eclipse 非常大，不論是檔案大小或是所需要的記憶體，記憶體建議 1GB 以上。</p>
<ul>
<li>
<h1><strong>安裝Eclipse</strong></h1>
</li>
</ul>
<p>到 Eclipse 官網 (<a href="http://www.eclipse.org/downloads/" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://www.eclipse.org/downloads/<span class="wpel-icon wpel-image wpel-icon-6"></span></a>) 根據自己的環境選擇對應的 Eclipse (Windows, Linux, Mac, 64bit, 32bit)，下載列表會看到很多例如：Java EE, Java, C/C++ &#8230; 等，這邊只要下載&nbsp;<span style="color: #ff0000;"><strong>Eclipse Classic</strong></span> 版本即可。<br />
下載回來後的檔案是一個壓縮檔(看環境)，解壓縮後執行 Eclipse.exe，視情況在桌面建立捷徑。</p>
<ul>
<li>
<h1><strong>第一次啟動</strong></h1>
</li>
</ul>
<p>第一次啟動會要求提供工作空間(workspace)，這邊直接使用每個不同系統的預設環境就好。</p>
<ul>
<li>
<h1><strong>安裝必須的插件(Plugins)</strong></h1>
</li>
</ul>
<p>如果一開始下載的就是 Eclipse for PHP Developers 的版本，可以直接跳過此步驟。<br />
這邊每個版本的情況會不同，<span style="color: #0000ff;">參考資料1的部分無法完成</span>，<span style="color: #ff0000;">因此這邊採用參考資料2</span>。</p>
<p style="text-align: center;"><a href="https://lh4.googleusercontent.com/-J7bsNAr6_d0/UNEwxXjh5VI/AAAAAAAAEz0/Oid-GsANgug/s800/001.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" title="Eclipse01" src="https://lh4.googleusercontent.com/-J7bsNAr6_d0/UNEwxXjh5VI/AAAAAAAAEz0/Oid-GsANgug/s800/001.png" alt="001 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="273" height="252"></a>&nbsp; &nbsp;&nbsp;<a href="https://lh5.googleusercontent.com/-Fl6hYb1J-1I/UNEwxfEWbLI/AAAAAAAAEz4/EWzl5fH5l3w/s800/002.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="alignnone" title="Eclipse02" src="https://lh5.googleusercontent.com/-Fl6hYb1J-1I/UNEwxfEWbLI/AAAAAAAAEz4/EWzl5fH5l3w/s800/002.png" alt="002 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="283" height="473"></a></p>
<p>從上方選單「<strong>Help</strong>」-&gt;「<strong>Install New Software&#8230;</strong>」-&gt;「<strong>Work with: Juno &#8211; http://download.eclipse.org/releases/juno (註1)</strong>」-&gt; 最下面找到「<span style="color: #ff0000;"><strong>Web, XML, Java EE and OSGi Enterprise Development</strong></span>」<br />
<a href="https://lh5.googleusercontent.com/-ErrbyQNC14c/UNEwxeD-hcI/AAAAAAAAEzw/Muaf3M9fI9g/s800/003.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse03" src="https://lh5.googleusercontent.com/-ErrbyQNC14c/UNEwxeD-hcI/AAAAAAAAEzw/Muaf3M9fI9g/s800/003.png" alt="003 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="364" height="306"></a><br />
-&gt; 勾選</p>
<pre>Eclipse Web Developer Tools
JavaScript Development Tools
PHP Development Tools (PDT) SDK Feature</pre>
<p>-&gt; 「<strong>Next &gt;</strong>」-&gt; 「<strong>Next &gt;</strong>」-&gt; 「<strong>I accept the terms of the license agreements</strong>」-&gt; 「<strong>Finish</strong>」-&gt; 完成後會重新啟動 Eclipse<br />
註1. &nbsp;juno 是 Eclipse 的版本名稱，不同版本下載回來後會有相對應的更新網址，這邊只要選 Eclipse 附帶的更新網址即可。</p>
<ul>
<li>
<h1><strong>設定 Moodle 偏好值</strong></h1>
</li>
</ul>
<p>參考資料1裡面的設定有些找不到，有些似乎沒那麼重要，就用著用著再慢慢去看要設定些什麼。</p>
<ul>
<li>
<h1><strong>安裝 EGit</strong></h1>
</li>
</ul>
<p>使用 Git 是為了讓往後版本控管比較容易一些，下載 Eclipse 的 EGit 插件。一樣到上方選單「<strong>Help</strong>」-&gt;「<strong>Install New Software&#8230;</strong>」-&gt;「<strong>Work with: Juno &#8211; http://download.eclipse.org/releases/juno</strong>」-&gt; 輸入「<span style="color: #ff0000;"><strong>git</strong></span>」<br />
<a href="https://lh6.googleusercontent.com/-yfIPUZkkWZc/UNEwyDpk4oI/AAAAAAAAEz8/C50lKxTVp8o/s800/004.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse04" src="https://lh6.googleusercontent.com/-yfIPUZkkWZc/UNEwyDpk4oI/AAAAAAAAEz8/C50lKxTVp8o/s800/004.png" alt="004 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="330" height="496"></a><br />
選擇 <span style="color: #ff0000;"><strong>Eclipse EGit</strong></span> 及 <span style="color: #ff0000;"><strong>Eclipse JGit</strong></span>，接著下一步直到完成安裝，完成安裝後系統會要求重新啟動 Eclipse。</p>
<ul>
<li>
<h1><strong>使用 EGit clone 原始碼</strong></h1>
</li>
</ul>
<p>這邊卡了一段時間，一直卡在到底是先 import project，還是先 Import Project From Git，而 Import Project From Git 後，又不允許讓他變成專案(會變成 FileSystem，而無法在 Eclipse 中使用)，後來發現原來 EGit 有自己的 Perspective，包含了平常 Git 的常用功能(參考資料3)，有用 Eclipse 開發過的話對這應該不陌生，像是 JavaEE, DDMS, JavaSE &#8230; 等等，只要切換到該 Perspective 裡面有就一些常用的 View 的組合。<br />
在 Eclipse 右上角找到一個 <span style="color: #ff0000;"><strong>Open Perspective</strong></span> 的圖案(看起來像一個視窗跟一個+符號，如下圖)，選擇 Open Perspective 視窗中的 <span style="color: #ff0000;"><strong>Git Repository Exploring</strong></span>。<br />
<a href="https://lh6.googleusercontent.com/-HRrxluEMKwE/UNF6J5XJwyI/AAAAAAAAE0o/c-rQJD9dLp4/s800/005.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse05" src="https://lh6.googleusercontent.com/-HRrxluEMKwE/UNF6J5XJwyI/AAAAAAAAE0o/c-rQJD9dLp4/s800/005.png" alt="005 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="359" height="342"></a><br />
在開啟的 <strong>Git Repository Exploring Perspective</strong> 中，左邊的<strong> Git Repositories</strong> 視窗中可以看到以下畫面， 選擇<span style="color: #ff0000;"><strong> Clone a Git repository</strong> </span>來匯入遠端已經存在的 repository。<br />
<a href="https://lh3.googleusercontent.com/-GJ0fCzqbjB8/UNF6J1AShKI/AAAAAAAAE0g/o_oIzQCtgOY/s800/006.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse06" src="https://lh3.googleusercontent.com/-GJ0fCzqbjB8/UNF6J1AShKI/AAAAAAAAE0g/o_oIzQCtgOY/s800/006.png" alt="006 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="321" height="144"></a><br />
接著輸入遠端 repository 的連線資訊。直接填寫 URI 以外的欄位，URI 欄位會根據填寫的內容自動產生。<br />
<a href="https://lh5.googleusercontent.com/-3bwzxPEtskM/UNF6J4YQCuI/AAAAAAAAE0k/XFD-Jz8w0HA/s800/007.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse07" src="https://lh5.googleusercontent.com/-3bwzxPEtskM/UNF6J4YQCuI/AAAAAAAAE0k/XFD-Jz8w0HA/s800/007.png" alt="007 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="473" height="445"></a><br />
選擇要匯入的 Branch。<br />
<a href="https://lh3.googleusercontent.com/-3xW2lQGjwFo/UNF6Kh1rLxI/AAAAAAAAE0s/AaonHR9iZSI/s800/008.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse08" src="https://lh3.googleusercontent.com/-3xW2lQGjwFo/UNF6Kh1rLxI/AAAAAAAAE0s/AaonHR9iZSI/s800/008.png" alt="008 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="473" height="445"></a><br />
選擇要存放的路徑。<br />
<a href="https://lh4.googleusercontent.com/-fZmRyUmBrXc/UNF6K7q7MDI/AAAAAAAAE00/FFi-bJLGD54/s800/009.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse09" src="https://lh4.googleusercontent.com/-fZmRyUmBrXc/UNF6K7q7MDI/AAAAAAAAE00/FFi-bJLGD54/s800/009.png" alt="009 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="473" height="445"></a><br />
開始下載 repository 的檔案。<br />
<a href="https://lh6.googleusercontent.com/-hAekrRZExec/UNF6K4BBnLI/AAAAAAAAE0w/MVVt8565g1I/s800/010.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse10" src="https://lh6.googleusercontent.com/-hAekrRZExec/UNF6K4BBnLI/AAAAAAAAE0w/MVVt8565g1I/s800/010.png" alt="010 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="419" height="277"></a><br />
完成後在 Git Repositories 視窗中可以看到所有 Git Repository 的資訊及檔案。<br />
<a href="https://lh3.googleusercontent.com/-NBcChZs-s-I/UNF8GyfqDGI/AAAAAAAAE1o/UaVncTtiagA/s800/011.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse011" src="https://lh3.googleusercontent.com/-NBcChZs-s-I/UNF8GyfqDGI/AAAAAAAAE1o/UaVncTtiagA/s800/011.png" alt="011 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="640" height="451"></a></p>
<ul>
<li>
<h1><strong>將 Git Repository 中的檔案匯入成 Project</strong></h1>
</li>
</ul>
<p>在這邊其實卡了很久，因為當時沒發現有 Git Repository Exploring Perspective，造成例如檔案會重複存在，無法 commit，無法匯入，提示目錄已存在等等的錯誤。Git Repository Exploring Perspective 也讓這些事情變得很簡單。首先在 Git Repositories 視窗中剛剛新增的 repository 點選滑鼠右鍵，選擇 <span style="color: #ff0000;"><strong>Import Projects &#8230;</strong></span><br />
<a href="https://lh4.googleusercontent.com/-yznECg9iSLQ/UNF8G-Cv9TI/AAAAAAAAE1k/oYYLL7hMhvM/s800/012.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse012" src="https://lh4.googleusercontent.com/-yznECg9iSLQ/UNF8G-Cv9TI/AAAAAAAAE1k/oYYLL7hMhvM/s800/012.png" alt="012 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="357" height="439"></a><br />
選擇最下面的 <span style="color: #ff0000;"><strong>Import as general project</strong></span>。<br />
<a href="https://lh4.googleusercontent.com/-KGm0ZKaorxA/UNF8G5zP94I/AAAAAAAAE1g/M336FD872aw/s800/013.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse013" src="https://lh4.googleusercontent.com/-KGm0ZKaorxA/UNF8G5zP94I/AAAAAAAAE1g/M336FD872aw/s800/013.png" alt="013 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="420" height="418"></a><br />
做最後確認。<br />
<a href="https://lh5.googleusercontent.com/-eAsBfZAhgco/UNF8HVsKcRI/AAAAAAAAE1w/-AHbnwfF6g4/s800/014.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse015" src="https://lh5.googleusercontent.com/-eAsBfZAhgco/UNF8HVsKcRI/AAAAAAAAE1w/-AHbnwfF6g4/s800/014.png" alt="014 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="420" height="418"></a><br />
完成後，到右上角的 Perspective 切換到 <span style="color: #ff0000;"><strong>PHP</strong></span>。<br />
<a href="https://lh4.googleusercontent.com/-wvEnQMeB3p8/UNF8HhRcXVI/AAAAAAAAE1s/iisozDUpch8/s800/015.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse016" src="https://lh4.googleusercontent.com/-wvEnQMeB3p8/UNF8HhRcXVI/AAAAAAAAE1s/iisozDUpch8/s800/015.png" alt="015 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="245" height="47"></a><br />
PHP Explorer 視窗中看到剛剛匯入的專案，每個檔案及資料夾右下方有一個黃黃的東西。<br />
<a href="https://lh4.googleusercontent.com/-T6Gubz3g3f4/UNF8Hg0klsI/AAAAAAAAE2I/M1GaESLNgO0/s800/016.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse016" src="https://lh4.googleusercontent.com/-T6Gubz3g3f4/UNF8Hg0klsI/AAAAAAAAE2I/M1GaESLNgO0/s800/016.png" alt="016 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="178" height="527"></a><br />
因為剛剛從 Git Repository 轉換成 general project(一般專案)，現在要把這整個專案轉換成 PHP 專案。在專案上點選<strong>滑鼠右鍵</strong> -&gt;<strong> Configure </strong>-&gt; <span style="color: #ff0000;"><strong>Add PHP Support &#8230;</strong></span><br />
<a href="https://lh4.googleusercontent.com/-apPfIpZiEl8/UNF8IAGO6OI/AAAAAAAAE2A/cbI-XbQr6zw/s800/017.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse017" src="https://lh4.googleusercontent.com/-apPfIpZiEl8/UNF8IAGO6OI/AAAAAAAAE2A/cbI-XbQr6zw/s800/017.png" alt="017 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="421" height="466"></a><br />
可以看到專案最下面已經加入了 PHP Libraries，到這邊基本的 Eclipse 開發 PHP 程式已經大功告成。<br />
<a href="https://lh3.googleusercontent.com/-XqSG2lwmrBk/UNF8ITn8iEI/AAAAAAAAE2E/nDPXkw8QD28/s800/018.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse018" src="https://lh3.googleusercontent.com/-XqSG2lwmrBk/UNF8ITn8iEI/AAAAAAAAE2E/nDPXkw8QD28/s800/018.png" alt="018 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="180" height="276"></a><br />
大費周章的用 Eclipse 開發的原因在於有時候變數或是 function 分散在一堆不同的檔案中，不僅除錯容易，在 trace 程式碼或是開發速度上都會有很明顯的幫助。例如：<br />
點選 ctrl 後指向 function name 或變數，就會直接開啟該 function 或該變數所在的檔案。<br />
<a href="https://lh4.googleusercontent.com/-2RJMbQ6XZdc/UNF8nbsxnVI/AAAAAAAAE2g/24g4RBfot-s/s800/019.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse19" src="https://lh4.googleusercontent.com/-2RJMbQ6XZdc/UNF8nbsxnVI/AAAAAAAAE2g/24g4RBfot-s/s800/019.png" alt="019 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="631" height="151"></a><br />
function 名稱或變數也有自動補齊的功能(<del>懶人專用</del>)。<br />
<a href="https://lh6.googleusercontent.com/--KqeK64kJk8/UNF8nYcDM3I/AAAAAAAAE2k/H_MQd-L0aok/s800/020.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse020" src="https://lh6.googleusercontent.com/--KqeK64kJk8/UNF8nYcDM3I/AAAAAAAAE2k/H_MQd-L0aok/s800/020.png" alt="020 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="575" height="295"></a><br />
游標停留在 function 或變數上不動，會出現該變數或 function 說明。<br />
<a href="https://lh5.googleusercontent.com/-ZAwSrhgIMSQ/UNGES8icd0I/AAAAAAAAE3A/rZ_JB3co3cw/s800/021.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="aligncenter" title="Eclipse022" src="https://lh5.googleusercontent.com/-ZAwSrhgIMSQ/UNGES8icd0I/AAAAAAAAE3A/rZ_JB3co3cw/s800/021.png" alt="021 在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)" width="800" height="237"></a><br />
至於其他 Git 操作，之後有需要再補上！<br />
<strong>參考資料：</strong></p>
<ol>
<li>Setting up Eclipse&nbsp;@ Moodle<br />
<address><a href="http://docs.moodle.org/dev/Setting_up_Eclipse" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://docs.moodle.org/dev/Setting_up_Eclipse<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
<li>Eclipse – 打造一個可以帶著走的 PHP IDE @ 莫希爾(Mosil)手札<br />
<address><a href="http://blog.mosil.biz/2012/07/eclipse-protable-ide-for-php/" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://blog.mosil.biz/2012/07/eclipse-protable-ide-for-php/<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
<li>How to import a GIT non-Eclipse Java project into Eclipse? @ stackoverflow<br />
<address><a href="http://stackoverflow.com/questions/8070017/how-to-import-a-git-non-eclipse-java-project-into-eclipse" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">http://blog.mosil.biz/2012/07/eclipse-protable-ide-for-php/<span class="wpel-icon wpel-image wpel-icon-6"></span></a></address>
</li>
</ol>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2539/%e5%9c%a8eclipse%e4%b8%8a%e9%96%8b%e7%99%bcphp%e7%a8%8b%e5%bc%8f%e4%bb%a5moodle%e3%80%81egit%e3%80%81pdt%e7%82%ba%e4%be%8b/" data-wpel-link="internal">在 Eclipse 上開發 PHP 程式(以 Moodle、EGit、PDT 為例)</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/2539/%e5%9c%a8eclipse%e4%b8%8a%e9%96%8b%e7%99%bcphp%e7%a8%8b%e5%bc%8f%e4%bb%a5moodle%e3%80%81egit%e3%80%81pdt%e7%82%ba%e4%be%8b/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>crontab -e相關使用及問題</title>
		<link>https://noter.tw/2000/crontab-e%e7%9b%b8%e9%97%9c%e4%bd%bf%e7%94%a8%e5%8f%8a%e5%95%8f%e9%a1%8c/</link>
					<comments>https://noter.tw/2000/crontab-e%e7%9b%b8%e9%97%9c%e4%bd%bf%e7%94%a8%e5%8f%8a%e5%95%8f%e9%a1%8c/#comments</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 15 Feb 2012 13:39:13 +0000</pubDate>
				<category><![CDATA[網頁後端]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[crontab]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=2000</guid>

					<description><![CDATA[<p>(2012-02-18更新)小蛙打算在「我的股票精算師」中加入可以即時查詢大盤以及個股的資訊，再透過RESTful的方式讓手機取得，而Server從證交所取得資料的部分，可能設定每分鐘或每五分鐘更新一&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2000/crontab-e%e7%9b%b8%e9%97%9c%e4%bd%bf%e7%94%a8%e5%8f%8a%e5%95%8f%e9%a1%8c/" data-wpel-link="internal">crontab -e相關使用及問題</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>(2012-02-18更新)小蛙打算在「<span style="color: #ff0000;"><strong>我的股票精算師</strong></span>」中加入可以<strong>即時查詢大盤以及個股</strong>的資訊，再透過<strong><span style="color: #ff0000;">RESTful</span></strong>的方式讓手機取得，而Server從證交所取得資料的部分，可能設定每分鐘或每五分鐘更新一次(降低Request次數，不曉得太頻繁的Request會不會被ban掉)，定期執行某項工作的任務就交給超好用的<span style="color: #ff0000;"><strong>crontab</strong></span>，這篇文章小蛙要記錄<strong>crontab -e設定以及執行PHP程式</strong>。<br />
<span id="more-2000"></span><br />
Linux部份的東西小蛙是一點兒也不拿手，下面的資料也都是從Google找到的，小蛙在<strong><a href="http://www.hkcode.com/programming/414" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">讓 crontab 自動排程執行 php @ 網路技術日誌<span class="wpel-icon wpel-image wpel-icon-6"></span></a></strong>中找到讓crontab執行php的方法，小蛙使用了文章中的方法二，直接從crontab -e去設定要執行的路徑及方法，做法如下：</p>
<pre class="brush: text; gutter: false">*/5  *  *  *    1-6     /usr/lib/cgi-bin/php5 -q /xxx/ooo/111.php &gt;&gt; /root/php 2&gt;&amp;2</pre>
<p>第一個<span style="color: #ff0000;"><span style="color: #000000;">「</span><strong>*/5</strong><span style="color: #000000;">」</span></span>指的是<span style="color: #000000;"><strong>每5分鐘執行一次</strong></span>(詳細設定請參考<strong><a href="https://linux.vbird.org/linux_basic/centos7/0430cron.php" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">第十六章、例行性工作排程 (crontab) @ 鳥哥的Linux私房菜<span class="wpel-icon wpel-image wpel-icon-6"></span></a></strong>)，「<strong><span style="color: #ff0000;">1-6</span></strong>」指的是<strong><span style="color: #000000;">星期一到星期六</span></strong>都要。「<span style="color: #ff0000;"><strong>/usr/lib/cgi-bin/php5 -q</strong></span>」小蛙不曉得為什麼PHP路徑在那麼奇怪的地方，後面的<span style="color: #ff0000;"><strong>-q</strong></span>也懶得去查所代表的意義，總之可以跑就對了(太懶&gt;&lt;)，「<span style="color: #ff0000;"><strong>/xxx/ooo/111.php</strong></span>」是要執行的PHP路徑。<br />
設定好之後確實是可以正常運作了，但是後來發現如果別人也知道這個網址，只要在瀏覽器打上一樣的網址，程式就會運行一次 &#8230; 聽起來是多麼可怕的一件事，所以小蛙加上了現在大家最常用的API KEY的方式判斷是否為「<strong>有權限執行</strong>」。但是上面的方法似乎就不能夠帶參數了，<strong><a href="http://www.piaoyi.org/php/Cron-PHP-parameter.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">Cron定时执行带参数的PHP代码 @ 飘易博客<span class="wpel-icon wpel-image wpel-icon-6"></span></a></strong>中提到了三種可以帶參數定期執行PHP的方法，恰巧小蛙前陣子在試node.js的時候已經安裝了<span style="color: #ff0000;"><strong>curl</strong></span>(不知道什麼是curl以及如何安裝，請到<strong><a href="http://tavi.debian.org.tw/index.php?page=curl" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">curl @ DebianWiki<span class="wpel-icon wpel-image wpel-icon-6"></span></a></strong>)，就決定用第三種(看起來也比較簡單)。</p>
<pre class="brush: text; gutter: false">*/5 * * * 1-6 curl 'http://xxx/ooo/111.php?APIKEY=123456&amp;s=hi' &gt;&gt; /root/php 2&gt;&amp;2</pre>
<p>上面那行就是最後的結果囉！希望這篇文章能對像小蛙一樣跟Linux不熟的網友有幫助！<br />
2012-02-18<br />
之前寫的定期備份wordpress的shell script手動可以正常執行，但只要放進crontab就完全不會動 &#8230; 後來在<strong><a href="https://linux.vbird.org/linux_basic/" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">鳥哥的 Linux 私房菜<span class="wpel-icon wpel-image wpel-icon-6"></span></a></strong>中發現shell script第一行要宣告使用的shell名稱。</p>
<blockquote><p>第一行 #!/bin/bash 在宣告這個 script 使用的 shell 名稱：<br />
因為我們使用的是 bash ，所以，必須要以『 <strong>#!/bin/bash</strong> 』來宣告這個檔案內的語法使用 bash 的語法！那麼當這個程式被執行時，他就能夠載入 bash 的相關環境設定檔 (一般來說就是 non-login shell 的 ~/.bashrc)， 並且執行 bash 來使我們底下的指令能夠執行！這很重要的！(在很多狀況中，如果沒有設定好這一行， 那麼該程式很可能會無法執行，因為系統可能無法判斷該程式需要使用什麼 shell 來執行啊！)</p></blockquote>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/2000/crontab-e%e7%9b%b8%e9%97%9c%e4%bd%bf%e7%94%a8%e5%8f%8a%e5%95%8f%e9%a1%8c/" data-wpel-link="internal">crontab -e相關使用及問題</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/2000/crontab-e%e7%9b%b8%e9%97%9c%e4%bd%bf%e7%94%a8%e5%8f%8a%e5%95%8f%e9%a1%8c/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
