Feb 22

Đã có bài viết với mục đích tương tự nhưng sử dụng code thông thường. Bài viết này sẽ đề cập một cách khác có vẻ đơn giản hơn đó là dùng DOM.

Ai chưa biết DOM là gì thì tự tìm hiểu nhé. Code như sau:


$dom = new domDocument ();
$dom->loadHTML ( $content);
$dom->preserveWhiteSpace = false;
$images = $dom->getElementsByTagName ( 'img' );
foreach ( $images as $image ) {
$pos = strpos ( $image->getAttribute ( 'src' ), '://' );

if ($pos != false) {
$name = microtime ( true ) . '.jpg';//rename file (option)
if (My_Plugin_Libs::getRemoteFile ( $image->getAttribute ( 'src' ), $path_to_dir. $name )) {
$result ['source'] [] = $image->getAttribute ( 'src' );
$result ['des'] [] = '[IMAGE_SERVER]' . '/' . $path . '/' . $name;
}
}
}
return str_replace ( $result ['source'], $result ['des'], $content );

Đoạn code trên bạn có thể tự tạo thành 1 function để dùng nhiều lần. Lưu ý các chi tiết sau $content là nội dung mà bạn muốn lọc ra file ảnh. $path_to_dir là thư mục bán muốn lưu ảnh trên server của mình. Dòng cuối cùng của đoạn code có tác dụng là thay thể đường dẫn cũ bằng đường dẫn mới của ảnh vừa lưu, tùy yêu cầu mà bạn có thể sử dụng luôn nó hoặc xóa đi.

Apr 10

Ý tương thực hiện việc này như sau: Bạn copy một đoạn text từ trang nào đó vào trang của mình nhưng lại muốn hệ thống tự động lưu toàn bộ những file ảnh trong nội dung html đó vào server của bạn. Có nghĩa là sau khi ấn Lưu thì toàn bộ dữ liệu liên quan đến bài đó sẽ ở trên server của bạn.


if (preg_match_all ( '/]+)\"/', $_POST ['description'], $regs )) {
$result = $regs [1];
foreach ( $result ['source'] as $item ) {
$name = microtime ( true ) . '.jpg'; //rename
$handle = fopen ( ROOT_DIR . DIRECTORY_SEPARATOR . DATA_DIR . DIRECTORY_SEPARATOR . $path . DIRECTORY_SEPARATOR . $News->id . DIRECTORY_SEPARATOR . $name, "w" ); //Đường dẫn lưu ảnh trên server
$somecontent = file_get_contents ( $item );
fwrite ( $handle, $somecontent );
fclose ( $handle );
$result ['des'] [] = $News->image_path . '/' . $name;
}
}

//Replace đường dẫn ảnh
$NewsContent->description = str_replace ( $result ['source'], $result ['des'], $NewsContent->description );

Như vậy đã xong khi đoạn script trên được thực thi nó sẽ tìm tất cả các đường dẫn ảnh trong nội dung. Ta cần bước rename file là để tránh trường hợp trang mà ta copy nội dung sử dụng đường dẫn ảnh động dạng như images.aspx?id=2 khi lấy về server của ta anh sẽ không hiển thị được.

Chúc bạn thành công!

Apr 08

Apr 08

Apr 03

Ở các hệ thống máy chủ chạy Plesk sẽ gặp hiện tường là nếu ở subdomain cần include một file nào ở maindomain hoặc thư mục cấp trên vào sẽ không thể sử lý được và bị lỗi dạng như sau:

Warning: file_exists() [function.file-exists]: open_basedir restriction in effect. File(/home/xyz) is not within the allowed path(s): (/home/xzy/:/tmp:/usr/local/lib/php/) in /home/xyz/domains/fontchu.com/public_html/blog/wp-includes/functions.php  on line 1737

(Có rất nhiều lỗi dạng này).

Có thể hiểu lỗi này xảy ra do máy chủ Apache được cấu hình mặc định bởi Plesk để không được phép truy cập vào các thư mục cấp cao hơn để đảm bảo tính an toàn.
Cách thức sử lỹ lỗi dạng này như sau:
Bước 1:
Tạo thêm một file có tên là vhost.conf tại thư mục conf của subdomain cần sử lý (/var/www/vhosts/<domain>/subdomains/<subdomain>/conf/vhost.conf)
Với nội dung như sau

<Directory /var/www/vhosts/<domain>/subdomains/<subdomain>/httpdocs>
<IfModule sapi_apache2.c>
php_admin_flag engine on
php_admin_flag safe_mode off
php_admin_value open_basedir “/var/www/vhosts/<domain>/httpdocs:/var/www/vhosts/<domain>/subdomains/<subdomain>/httpdocs:/tmp”
</IfModule>
<IfModule mod_php5.c>
php_admin_flag engine on
php_admin_flag safe_mode off
php_admin_value open_basedir “/var/www/vhosts/<domain>/httpdocs:/var/www/vhosts/<domain>/subdomains/<subdomain>/httpdocs:/tmp”
</IfModule>
</Directory>

Trong php_admin_value open_basedir bạn đưa tất cả các thư mục mà các sử lý trong subdomain này có thể truy xuất vào theo câu trúc như trên.

Thay <domain> bằng tên domain của bạn, <subdomain> bằng tên subdomain của bạn
lâu lại thay đổi
Bước 2: Để cập nhật các cấu hình mới vào hệ thống cần chạy lệnh sau (thay domain bằng tên domain của bạn)

/usr/local/psa/admin/sbin/websrvmng -u –vhost-name=domain.tld

Bước 3: Khởi động lại Apache: Service httpd restart
Chúc bạn thành công

Tagged with:
Apr 03

Trước khi đọc và thực hiện theo hướng dẫn ở bài này yêu cầu bạn đã biết cách cấu hình để có thể thực hiện Data Replication dạng Master->  Slave

Khi nghe đến Database Replication người ta nghĩ ngay đến khả  năng đồng bộ giữa các máy chủ dữ liệu một cách tự động với nhau theo hướng Master -> Slave có nghĩa là Slave sẽ là bản sao của Master mà không thể ngược lại. Tức là mọi thay đổi trên Master sẽ được làm y nguyên trên Slave chứ khi có sự thay đổi trên Slave thì không ảnh hưởng gì đến Master nhưng có thể sẽ làm hỏng quá trình 2 database này đồng bộ với nhau.

Còn 1 loại đồng bộ nữa đó là 2 database này ngang hàng với nhau, chúng tác động qua lại với nhau và thay nhau làm chủ. Tức là khi Database 1 có sự thay đôi về dữ liệu thì nó sẽ làm Master để Database 2 đồng bộ theo và ngược lại. Cái cần thiết đó là cấu hình làm sao để không bị xảy ra hiện tường trùng Primary key của các tables.

MySQL đã đưa vào thêm 3 định nghĩa (chính xác hơn là 2 thuộc tính mới) ảnh hưởng đến quá trình Replication này đó là replicate-same-server-id:

auto-increment-increment: Phải được đặt bằng với số lượng server sẽ tham ra đồng bộ ở dạng này (Dual master)

auto-increment-offset: Báo cho Server biết là bước nhảy của trường auto-increment (thường là primary-key) như thế nào.

Ví dụ cụ thể như sau:

Tôi có 2 MySQL server với tên là server1 và server2, 2 MySQL server này chạy trên 2 máy chủ độc lập với nhau và tôi cần đồng bộ 2 server này với nhau theo kiểu Master<->Master cho 2 database có tên là dbname

Bước 1. Đồng bộ dữ liệu bạn đầu: Dùng các chương trình backup và Restore để đảm bảo rằng dữ liệu của database dbname ở cả 2 server là như nhau trước khi thực hiện các bước tiếp theo.

Bước 2. Cấp quyền thực hiện Repilcation cho User:

Tại mỗi server ta đăng nhập vào MySQL với quyền Root và thực hiện 2 câu lệnh:


GRANT REPLICATION SLAVE ON *.* TO ‘slave_user’@'%’ IDENTIFIED BY ‘<some_password>’;
(thay đổi slave_user bằng username và <some_password> bằng password của user mà bạn dùng để đồng bộ)

FLUSH PRIVILEGES;

Bước 3. Cấu hình để MySQL Database chấp nhận đồng bộ dạng Master <-> Master:

Tại Server1 ta làm như sau:

Mở file my.conf hoặc my.ini bằng một text-editor nào đó và thêm vào đoạn sau trong phần [mysql]

server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1

master-host = <Server2>
master-user = <slave user>
master-password = <slave password>
master-connect-retry = 60
replicate-do-db = <database name>

log-bin =mysql-bin.log
binlog-do-db = <database name>

relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index

Tại server2 ta làm tương tự nhưng với nội dung hơi khác một chút

server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset =2

master-host = <Server1>
master-user = <slave user>
master-password = <slave password>
master-connect-retry = 60
replicate-do-db = <database name>

log-bin =mysql-bin.log
binlog-do-db = <database name>

relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index

Trong 2 đoạn trên các phần chữ đầm là phần các bạn phải chỉnh lại cho phù hợp, những phần màu đỏ là đánh dấu sự khác nhau giữa 2 server

Bước 4. Chuẩn bị để bắt đầu đồng bộ:

Tính đến đây thì phần cấu hình coi như đã xong, ta cần tiến hành báo cho 2 máy chủ biết là phải tiến hành bắt đầu đồng bộ từ đâu. Nghĩa là báo cho server2 biết bắt đầu đồng bộ từ dòng bao nhiêu trong relay-log của server1 và ngược lại

Tai cả 2 máy chủ tạm dừng đồng bộ bằng lệnh slave stop.

Lấy thông tin về Relay-log hiện tại ở server1. Tại server1 đăng nhâp vào MySQL bằng tài khoản root và chạy lệnh:

Show master status;

kết quả dạng sau:

+---------------+----------+--------------+------------------+
| File          | Position | Binlog_do_db | Binlog_ignore_db |
+---------------+----------+--------------+------------------+
| mysql-bin.006 | 183      | exampledb    |                  |
+---------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Tại server2 đăng nhâp vào MySQL bằng tài khoản root và chạy lệnh:
CHANGE MASTER TO MASTER_HOST=’<server1>’, MASTER_USER=’<slave user>’, MASTER_PASSWORD=’<slave  password>’, MASTER_LOG_FILE=’<mysql-bin.006>’,  MASTER_LOG_POS=<183>;
Tại server2 tiến hành Show master status; để lấy File và Position và thay vào câu lệnh chạy trên server1 như trên

Bước 5. Tiến hành đồng bộ:
Khâu chuân bị đã hoàn tất, tại lần lượt các server ta chạy lệnh Slave Start; trong MySQL Console
Bước 6. Kiểm tra:
Tại các server chạy lệnh Show slave status\G và xem 2 thống số “Slave_IO_Running” và “Slave_SQL_Running” nếu đều là Yes thì coi như thành công, còn có lỗi thì cần kiểm tra kỹ lại các bước.

Chúc các bạn thành công!


Tagged with:
Apr 03

Vào một ngày nọ trước kỷ băng hà. Khủng long bạo chứa dủ dê Khủng Long ăn cỏ và Lợn cùng thi thố xem nội công ai cao cường hơn.

Với vóc dáng to lớn đồ sộ của mình Khủng long bạo chúa kiêu hãnh thể hiện trước. Tư thế ung dung khoan thai ấy thể mà chi sau một đợt vận khí Bạo chúa đã làm cho Khủng long ăn thịt phải giật mình khiếp sợ.

Tiếp đến là màn thể hiện của khủng long ăn thịt, biết mình thân hình nhỏ bé không thể so sánh được với đàn anh đi trước. hắn ta vận toàn bộ khí công. Lần thứ nhất… xem ra có vẻ chưa đủ. Thấy đàn em có vẻ yếu thế Bạo chúa hích mũi động viên. Lần này Ăn thịt lấy hết sức bình sinh chuyển thành phàn lực đẩy ra đằng sau. Và tất nhiên cái gì cũng có giá của nó, vì nhỏ bé nên phản lực đã khiến Ăn thịt bay vong vèo trên đầu trước con mắt đầy sửng sốt của Bạo chúa. Có vẻ như Bạo chúa và Ăn thịt “Kẻ 8 lạng, người nửa cân”, cả hai hả hê quai sang nhìn Lợn.

Đừng nhìn 2 con khủng long thi triển tài năng này giờ, Lợn ta không mảy may tỏ thái độ gì. Đột nhiên…

Không khí có mùi gì vậy?! Ăn thịt la lớn. Còn Bạo chua thì ngơ ngác nhìn trước sau!

Bao chùm cả 2 con khủng long là một màn hơi độc chết người, đến khi cả hai hiểu ra vấn đề thì đã quá muộn. Hóa ra trước đó vài giây Lợn đã thể hiện vòng thì của mình tất nhiên kết quả ra sao thì ai cung biết…

p/s: Theo nguồn thì đáng tin cậy cho phóng vấn của kênh PBC biết: Biết mình nội công không cao nên Lợn ta đã tu luyện thêm môn phái “Tà giáo”, “Ngụ độc” nên đã dùng chiêu thức “Hậu Long, Ngũ quỷ tà độc khí” để đánh bại 2 đối thủ trên. Thật là lợi hai vô cùng…

Pixar – Jurrasic fart

Tagged with:
Feb 25

Một clip khá thú vị của PIXAR Nếu bạn nào hay xem hoạt hình 3D kênh Disney channel thì chắc chắn đã xem phim của Studio này rồi.

Tagged with:
preload preload preload