搜尋
首頁後端開發php教程php連接redis的操作庫predis操作大全

predis是php連接redis的操作庫,由於它完全使用php編寫,大量使用命名空間以及閉包等功能,只支援php5.3以上版本,故實測性能一般,每秒25000次讀寫,相信改換c語言編寫的php擴充後效能會大幅提升(例如使用C擴充phpredis https://github.com/owlient/phpredis)。

將session資料存放到redis也很簡單:
session.save_handler = redis
session.save_path = “tcp://127.0.0.1:6379″

以下是總結一些操作,並不斷更新。

  1. //使用autoload載入相關函式庫,這邊重點就是為了require $file;
  2. spl_autoload_register(function($class) {
  3. $file = __DIR__.'/ lib/Predis/'.$class.'.php';
  4. if (file_exists($file)) {
  5. require $file;
  6. return true;
  7. }
  8. });
  9. //設定連接的IP、連接埠、以及對應的資料庫
  10. $server = array(
  11. 'host' => '127.0.0.1',
  12. 'port' = > 6379,
  13. 'database' => 15
  14. );
  15. $redis = new Client($server);
  16. //普通set/get操作
  17. $redis-> set('library', 'predis');
  18. $retval = $redis->get('library');
  19. echo $retval; //顯示'predis'
  20. //setex set一個儲存時效
  21. $redis->setex('str', 10, 'bar'); //表示儲存有效期限為10秒
  22. //setnx/msetnx相當於add作業,不會覆寫已有值
  23. $redis->setnx('foo',12); //true
  24. $redis->setnx('foo',34); //false
  25. // getset操作,set的變體,結果回傳替換前的值
  26. $redis->getset('foo',56);//回傳34
  27. // incrby/incr/decrby/decr 對值的遞增和遞減
  28. $redis->incr('foo'); //foo為57
  29. $redis->incrby('foo',2); //foo為59
  30. //exists偵測是否存在某值
  31. $redis->exists('foo');//true
  32. //del 刪除
  33. $redis->del('foo');/ /true
  34. //type 類型偵測,字串回傳string,清單回傳list,set表回傳set/zset,hash表回傳hash
  35. $redis->type('foo');//不存在,回傳none
  36. $redis->set('str','test');
  37. $redis->type('str'); //字串,回傳string
  38. //append 連接到已存在字串
  39. $redis->append('str','_123'); //傳回累加後的字串長度8,此進str為'test_123'
  40. //setrange 部分替換操作
  41. $redis->setrange('str',0,'abc'); //傳回3,參數2為0時等同於set運算
  42. $redis->setrange( 'str',2,'cd');//回傳4,表示從第2個字元後替換,這時'str'為'abcd'
  43. //substr 部分取得運算
  44. $ redis->substr('str',0,2);//表示從第0個起,取到第2個字符,共3個,返回'abc'
  45. //strlen 取得字串長度
  46. $redis->strlen('str'); //回傳4
  47. //setbit/getbit 位元儲存與取得
  48. $redis->setbit('binary',31,1 ); //表示在第31位存入1,這邊可能會有大小端問題?不過沒關係,getbit 應該不會有問題
  49. $redis->getbit('binary',31); //返回1
  50. //keys 模糊查找功能,支援*號以及?號(匹配一個字元)
  51. $redis->set('foo1',123);
  52. $redis->set( 'foo2',456);
  53. $redis->keys('foo*'); //回傳foo1和foo2的array
  54. $redis->keys('f?o?'); //同上
  55. //randomkey 隨機回傳一個key
  56. $redis->randomkey(); //可能是回傳'foo1'或是'foo2'及其它任何一存在redis的key
  57. //rename/renamenx 對key進行改名,不同的是renamenx不允許改成已存在的key
  58. $redis->rename('str','str2'); //把原先命名為'str '的key改成了'str2'
  59. //expire 設定key-value的時效性,ttl 取得剩餘有效期限,persist 重新設定為永久儲存
  60. $redis->expire('foo', 1); //設定有效期限為1秒
  61. $redis->ttl('foo'); //傳回有效期限值1s
  62. $redis->expire('foo'); //取消expire行為
  63. //dbsize 傳回redis目前資料庫的記錄總數
  64. $redis->dbsize();
  65. /*
  66. 佇列操作
  67. */
  68. //rpush/rpushx 有序列表操作,從隊列後插入元素
  69. //lpush/lpushx 和rpush/rpushx的區別是插入到隊列的頭部,同上,'x'含義是只對已存在的key進行操作
  70. $redis->rpush('fooList', 'bar1'); //傳回一個清單的長度1
  71. $redis->lpush('fooList', 'bar0'); //回傳一個列表的長度2
  72. $redis->rpushx('fooList', 'bar2'); //傳回3,rpushx只對已存在的佇列做新增,否則回傳0
  73. //llen回傳目前清單長度
  74. $redis->llen('fooList');//3
  75. //lrange 傳回佇列中一個區間的元素
  76. $redis->lrange('fooList',0,1) ; //回傳陣列包含第0至第1個共2個元素
  77. $redis->lrange('fooList',0,-1);//傳回第0個至倒數第一個,相當於回傳所有元素,注意redis中很多時候會用到負數,下同
  78. //lindex 回傳指定順序位置的list元素
  79. $redis->lindex('fooList',1); //傳回'bar1'
  80. //lset 修改佇列中指定位置的value
  81. $redis->lset('fooList',1,'123');//修改位置1的元素,傳回true
  82. //lrem 刪除佇列中左起指定數量的字元
  83. $redis->lrem('fooList',1,'_'); //刪除佇列中左起(右起使用- 1)1個字元'_'(若有)
  84. //lpop/rpop 類似堆疊結構地彈出(並刪除)最左或最右的一個元素
  85. $redis->lpop(' fooList'); //'bar0'
  86. $redis->rpop('fooList'); //'bar2'
  87. //ltrim 隊列修改,保留左邊起若干元素,其餘刪除
  88. $redis->ltrim('fooList', 0,1); //保留左邊起第0個至第1個元素
  89. //rpoplpush 從一個隊列中pop出元素並push到另一個隊列
  90. $redis->rpush('list1','ab0');
  91. $redis->rpush('list1','ab1');
  92. $redis->rpush('list2', 'ab2');
  93. $redis->rpush('list2','ab3');
  94. $redis->rpoplpush('list1','list2');//結果list1 =>array('ab0'),list2 =>array('ab1','ab2','ab3')
  95. $redis ->rpoplpush('list2','list2');//也適用於同一個隊列,把最後一個元素移到頭部list2 =>array('ab3','ab1','ab2')
  96. //linsert 在佇列的中間指定元素前後插入元素
  97. $redis->linsert('list2', 'before','ab1','123'); //表示在元素'ab1 '之前插入'123'
  98. $redis->linsert('list2', 'after','ab1','456'); //表示在元素'ab1'之後插入'456'
  99. //blpop/brpop 阻塞並等待一個列隊不為空時,再pop出最左或最右的一個元素(這個功能在php以外可以說非常好用)
  100. //brpoplpush 同樣是阻塞並等待操作,結果同rpoplpush一樣
  101. $redis->blpop('list3',10); //如果list3為空則一直等待,直到不為空時將第一元素彈出,10秒後超時
  102. /**
  103. set表操作
  104. */
  105. //sadd 增加元素,回傳true,重複回傳false
  106. $redis->sadd('set1','ab');
  107. $redis->sadd('set1','cd');
  108. $redis->sadd('set1','ef');
  109. //srem 移除指定元素
  110. $ redis->srem('set1','cd'); //刪除'cd'元素
  111. //spop 彈出首元素
  112. $redis->spop('set1');
  113. //smove 移動目前set表的指定元素到另一個set表
  114. $redis->sadd('set2','123');
  115. $redis->smove('set1',' set2','ab');//移動'set1'中的'ab'到'set2',回傳true or false
  116. //scard 傳回目前set表元素個數
  117. $redis- >scard('set2');//2
  118. //sismember 判斷元素是否屬於目前表格
  119. $redis->sismember('set2','123'); //true 或 false
  120. //smembers 傳回目前表格的所有元素
  121. $redis->smembers('set2'); //array('123','ab');
  122. //sinter /sunion/sdiff 傳回兩個表中元素的交集/並集/補集
  123. $redis->sadd('set1','ab');
  124. $redis->sinter('set2',' set1'); //回傳array('ab')
  125. //sinterstore/sunionstore/sdiffstore 將兩個表交集/並集/補集元素copy到第三表
  126. $redis ->set('foo',0);
  127. $redis->sinterstore('foo','set1'); //這邊等同於將'set1'的內容copy到'foo'中,並將'foo'轉為set表
  128. $redis->sinterstore('foo',array('set1','set2')); //將'set1'和'set2'中相同的元素copy到'foo '表中,覆蓋'foo'原有內容
  129. //srandmember 返回表中一個隨機元素
  130. $redis->srandmember('set1');
  131. /**
  132. 有序set表操作
  133. */
  134. //sadd 增加元素,並設定序號,回傳true,重複回傳false
  135. $redis->zadd('zset1',1,'ab');
  136. $ redis->zadd('zset1',2,'cd');
  137. $redis->zadd('zset1',3,'ef');
  138. //zincrby 對指定元素索引值的增減,改變元素排列次序
  139. $redis->zincrby('zset1',10,'ab');//返回11
  140. //zrem 移除指定元素
  141. $redis ->zrem('zset1','ef'); //true or false
  142. //zrange 依位置次序傳回表中指定區間的元素
  143. $redis->zrange('zset1', 0,1); //傳回位置0和1之間(兩個)的元素
  144. $redis->zrange('zset1',0,-1);//回傳位置0和倒數第一個元素之間的元素(相當於所有元素)
  145. //zrevrange 同上,返回表中指定區間的元素,按次序倒排
  146. $redis->zrevrange('zset1',0,-1 ); //元素順序和zrange相反
  147. //zrangebyscore/zrevrangebyscore 依序/降序返回表中指定索引區間的元素
  148. $redis->zadd('zset1',3,'ef' );
  149. $redis->zadd('zset1',5,'gh');
  150. $redis->zrangebyscore('zset1',2,9); //傳回索引值2-9之間的元素array('ef','gh')
  151. //參數形式
  152. $redis->zrangebyscore('zset1',2,9,'withscores'); //傳回索引值2-9之間的元素並包含索引值array(array('ef',3),array('gh',5))
  153. $redis->zrangebyscore('zset1',2,9,array('withscores' = >true,'limit'=>array(1, 2))); //傳回索引值2-9之間的元素,'withscores' =>true表示包含索引值; 'limit'=>array(1, 2),表示最多回傳2條,結果為array(array('ef',3),array('gh',5))
  154. //zunionstore/zinterstore 將多個表格的並集/交集存入另一個表
  155. $redis->zunionstore('zset3',array('zset1','zset2','zset0')); //將'zset1','zset2','zset0'的並集存入'zset3'
  156. //其它參數
  157. $redis->zunionstore('zset3',array('zset1','zset2'),array('weights' => array(5, 0)));//weights參數表示權重,其中表示並集後值大於5的元素排在前,大於0的排在後
  158. $redis->zunionstore('zset3',array('zset1' ,'zset2'),array('aggregate' => 'max'));//'aggregate' => 'max'或'min'表示並集後相同的元素是取大值或是取小值
  159. //zcount 統計一個索引區間的元素個數
  160. $redis->zcount('zset1',3,5);//2
  161. $redis->zcount('zset1', '(3',5)); //'(3'表示索引值在3-5之間但不含3,同理也可以使用'(5'表示上限為5但不含5
  162. //zcard 統計元素個數
  163. $redis->zcard('zset1');//4
  164. //zscore 查詢元素的索引
  165. $redis->zscore('zset1','ef');//3
  166. //zremrangebyscore 刪除一個索引區間的元素
  167. $redis->zremrangebyscore('zset1',0,2) ; //刪除索引在0-2之間的元素('ab','cd'),傳回刪除元素個數2
  168. //zrank/zrevrank 回傳元素所在表格順序/降序的位置(不是索引)
  169. $redis->zrank('zset1','ef');//返回0,因為它是第一個元素;zrevrank則回傳1(最後一個)
  170. // zremrangebyrank 刪除表中指定位置區間的元素
  171. $redis->zremrangebyrank('zset1',0,10); //刪除位置為0-10的元素,傳回刪除的元素個數2
  172. /**
  173. hash表操作
  174. */
  175. //hset/hget 存取hash表的資料
  176. $redis->hset('hash1','key1','v1'); //將key為'key1' value為'v1'的元素存入hash1表
  177. $redis->hset('hash1','key2','v2');
  178. $redis->hget('hash1 ','key1'); //取出表格'hash1'中的key 'key1'的值,回傳'v1'
  179. //hexists 傳回hash表中的指定key是否存在
  180. $redis ->hexists ('hash1','key1'); //true or false
  181. //hdel 刪除hash表中指定key的元素
  182. $redis->hdel('hash1','key2 '); //true or false
  183. //hlen 回傳hash表元素個數
  184. $redis->hlen('hash1'); //1
  185. //hsetnx 增加一個元素,但不能重複
  186. $redis->hsetnx('hash1','key1','v2'); //false
  187. $redis->hsetnx('hash1','key2','v2 '); //true
  188. //hmset/hmget 訪問多個元素到hash表
  189. $redis->hmset('hash1',array('key3'=>'v3',' key4'=>'v4'));
  190. $redis->hmget('hash1',array('key3','key4')); //傳回對應的值array('v3','v4' )
  191. //hincrby 對指定key進行累加
  192. $redis->hincrby('hash1','key5',3); //回傳3
  193. $redis->hincrby('hash1 ','key5',10); //回傳13
  194. //hkeys 回傳hash表中的所有key
  195. $redis->hkeys('hash1'); //傳回array('key1 ','key2','key3','key4','key5')
  196. //hvals 回傳hash表中的所有value
  197. $redis->hvals('hash1'); //回傳array('v1','v2','v3','v4',13)
  198. //hgetall 回傳整個hash表元素
  199. $redis->hgetall('hash1'); / /回傳array('key1'=>'v1','key2'=>'v2','key3'=>'v3','key4'=>'v4','key5'=>13)
  200. /**
  201. 排序操作
  202. */
  203. //sort 排序
  204. $redis->rpush('tab',3);
  205. $redis->rpush('tab', 2);
  206. $redis->rpush('tab',17);
  207. $redis->sort('tab'); //回傳array(2,3,17)
  208. //使用參數,可組合使用array('sort' => 'desc','limit' => array(1, 2))
  209. $redis->sort('tab',array('sort' => 'desc ')); //降序排列,回傳array(17,3,2)
  210. $redis->sort('tab',array('limit' => array(1, 2))); //回順序位置中1的元素2個(這裡的2是指個數,而不是位置),傳回array(3,17)
  211. $redis->sort('tab',array('limit' => array ('alpha' => true))); //依首字排序回傳array(17,2,3),因為17的首字是'1'所以排首位置
  212. $redis->sort(' tab',array('limit' => array('store' => 'ordered'))); //表示永久性排序,傳回元素個數
  213. $redis->sort('tab',array( 'limit' => array('get' => 'pre_*'))); //使用了通配符'*'過濾元素,表示只回傳以'pre_'開頭的元素
  214. /**
  215. redis管理操作
  216. */
  217. //select 指定要操作的資料庫
  218. $redis->select('mydb'); //指定為mydb,不存在則建立
  219. / /flushdb 清空目前庫
  220. $redis->flushdb();
  221. //move 移動當庫的元素到其它庫
  222. $redis->set('foo', 'bar') ;
  223. $redis->move('foo', 'mydb2'); //若'mydb2'庫存在
  224. //info 顯示服務當狀態資訊
  225. $redis->info( );
  226. //slaveof 設定從伺服器
  227. $redis->slaveof('127.0.0.1',80); //設定127.0.0.1埠80的伺服器為從伺服器
  228. $redis ->slaveof(); //清除從伺服器
  229. //同步儲存伺服器資料到磁碟
  230. $redis->save();
  231. //非同步儲存伺服器資料到磁碟
  232. $redis->bgsave();
  233. //??
  234. $redis->bgrewriteaof();
  235. //傳回最後更新磁碟的時間
  236. $redis->lastsave();
  237. //set/get多個key-value
  238. $mkv = array(
  239. 'usr:0001' => 'First user',
  240. 'usr:0002' => 'Second user ',
  241. 'usr:0003' => 'Third user'
  242. );
  243. $redis->mset($mkv); //儲存多個key對應的value
  244. $retval = $ redis->mget(array_keys($mkv)); //取得多個key對應的value
  245. print_r($retval);
  246. //批次運算
  247. $replies = $redis-> pipeline(function($pipe) {
  248. $pipe->ping();
  249. $pipe->flushdb();
  250. $pipe->incrby('counter', 10); //增量操作
  251. $pipe->incrby('counter', 30);
  252. $pipe->exists('counter');
  253. $pipe->get('counter');
  254. $pipe ->mget('does_not_exist', 'counter');
  255. });
  256. print_r($replies);
  257. //CAS,事務性操作
  258. function zpop($client, $zsetKey) {
  259. $element = null;
  260. $options = array(
  261. 'cas' => true, // 初始化並支援CAS 操作
  262. 'watch' => $zsetKey, // 需要WATCH 來偵測更改的鍵
  263. 'retry' = > 3, // 中止交易的重試次數,
  264. // 客戶端因異常而退出。 tx)
  265. use ($zsetKey, &$element) {
  266. @list($element) = $tx->zrange($zsetKey, 0, 0);
  267. if (isset($element)) {
  268. $tx->multi(); // 使用CAS,*必須* 明確呼叫。
  269. return $element;
  270. }
  271. $zpopped = zpop($redis, 'zset');
  272. echo isset($zpopped) ? "ZPOPed $zpopped" : "Nothing to ZPOP!", "n";
  273. //對訪問的key加出口,如: 'nrk:'
  274. $redis->getProfile() -> setPreprocessor(new KeyPrefixPreprocessor('nrk:'));
  275. //遍歷的一些儲存方法
  276. $multiple_servers = array(
  277. array(
  278. 'host' =>) ; .0.1',
  279. '連接埠' => 6379,
  280. '資料庫' => 15,
  281. '別名',
  282. ),
  283. array(
  284. '主機' => ' 127.0.0.1',
  285. '連接埠' => 6380,
  286. '資料庫' => 15,
  287. '別名' => '第二個',
  288. ),
  289. );
  290. 使用PredisDistributionIDistributionStrategy;
  291. 類別NaiveDistributionStrategy 實作IDistributionStrategy {
  292. private $_nostructdes, $_nodesCount; $this->_nodesCount = 0;
  293. }
  294. public function add($node, $weight = null) {
  295. $this->_nodes[] = $node;
  296. $this->_nodesCount ;
  297. }
  298. public function remove($node) {
  299. $ this->_nodes = array_filter($this->_nodes, function($ n) use($node) {
  300. return $n !== $node;
  301. });
  302. $this- >_nodesCount = count($this->_nodes);
  303. }
  304. public function get($key) {
  305. $count = $this->_nodesCount;
  306. if ( $count === 0) {
  307. throw new RuntimeException('無連接');
  308. }
  309. return $this->_nodes[$count >; 1 ? abs(crc32($key) % $count) : 0];
  310. }
  311. public functiongenerateKeyKeyKeyKeyKeyKey ($value) {
  312. return crc32($value);
  313. }
  314. }
  315. //設定鍵指派政策
  316. $options = array(
  317. 'key_distribution' =distribution' = > new NaiveDistributionStrategy(),
  318. );
  319. $redis = new PredisClient($multiple_servers, $options);
  320. for ($i = 0; $i set("key: $i", str_pad($i, 4, '0', 0));
  321. $redis->get("key:$i");
  322. }
  323. $server1 = $ redis->getClientFor('first')->info();
  324. $server2 = $redis->getClientFor('second')->info();
  325. printf("伺服器'%s ' 有%d 個金鑰,而伺服器'%s' 有%d 個金鑰。 n",
  326. '第一個', $server1['db15']['keys'], '第二', $server2['db15']['keys']
  327. );
  328. 複製程式碼
php、redis、predis
本主題由小貝 於 2015-11-12 08:43 移動

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
PHP的目的:構建動態網站PHP的目的:構建動態網站Apr 15, 2025 am 12:18 AM

PHP用於構建動態網站,其核心功能包括:1.生成動態內容,通過與數據庫對接實時生成網頁;2.處理用戶交互和表單提交,驗證輸入並響應操作;3.管理會話和用戶認證,提供個性化體驗;4.優化性能和遵循最佳實踐,提升網站效率和安全性。

PHP:處理數據庫和服務器端邏輯PHP:處理數據庫和服務器端邏輯Apr 15, 2025 am 12:15 AM

PHP在數據庫操作和服務器端邏輯處理中使用MySQLi和PDO擴展進行數據庫交互,並通過會話管理等功能處理服務器端邏輯。 1)使用MySQLi或PDO連接數據庫,執行SQL查詢。 2)通過會話管理等功能處理HTTP請求和用戶狀態。 3)使用事務確保數據庫操作的原子性。 4)防止SQL注入,使用異常處理和關閉連接來調試。 5)通過索引和緩存優化性能,編寫可讀性高的代碼並進行錯誤處理。

您如何防止PHP中的SQL注入? (準備的陳述,PDO)您如何防止PHP中的SQL注入? (準備的陳述,PDO)Apr 15, 2025 am 12:15 AM

在PHP中使用預處理語句和PDO可以有效防範SQL注入攻擊。 1)使用PDO連接數據庫並設置錯誤模式。 2)通過prepare方法創建預處理語句,使用佔位符和execute方法傳遞數據。 3)處理查詢結果並確保代碼的安全性和性能。

PHP和Python:代碼示例和比較PHP和Python:代碼示例和比較Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP行動:現實世界中的示例和應用程序PHP行動:現實世界中的示例和應用程序Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:輕鬆創建交互式Web內容PHP:輕鬆創建交互式Web內容Apr 14, 2025 am 12:15 AM

PHP可以輕鬆創建互動網頁內容。 1)通過嵌入HTML動態生成內容,根據用戶輸入或數據庫數據實時展示。 2)處理表單提交並生成動態輸出,確保使用htmlspecialchars防XSS。 3)結合MySQL創建用戶註冊系統,使用password_hash和預處理語句增強安全性。掌握這些技巧將提升Web開發效率。

PHP和Python:比較兩種流行的編程語言PHP和Python:比較兩種流行的編程語言Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP的持久相關性:它還活著嗎?PHP的持久相關性:它還活著嗎?Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能