E đang gặp khó khăn và không hiểu function này site ở đâu mà file txt của em nó write trồng chéo lên nhau mà e ko biết fix kiểu gì. Code: public function set_viewer($action, $fid, $viewed = false, $viewed_day = false, $viewed_week = false, $viewed_month = false, $liked = false, $disliked = false){ $path = '/home/view.txt'; $file = file_get_contents($path); if(strpos($file, "post-".$fid."|") !== FALSE && is_numeric($fid) && is_numeric($viewed) && is_numeric($viewed_day) && is_numeric($viewed_week) && is_numeric($viewed_month) && is_numeric($liked) && is_numeric($disliked)){ $lines = file($path); foreach ($lines as $lineNumber => $line) { if (strpos($line, "post-".$fid."|") !== FALSE) { $cut = explode("|", trim($line)); if($action == "view"){ $replace = "post-".$fid."|".($cut[1]+1)."|".($cut[2]+1)."|".($cut[3]+1)."|".($cut[4]+1)."|".$cut[5]."|".$cut[6].PHP_EOL; $str = str_replace($line, $replace , $file); file_put_contents($path, $str); }else if($action == "liked"){ $replace = "post-".$fid."|".$cut[1]."|".$cut[2]."|".$cut[3]."|".$cut[4]."|".($cut[5]+1)."|".$cut[6].PHP_EOL; $str = str_replace($line, $replace , $file); file_put_contents($path, $str); }else if($action == "dislike"){ $replace = "post-".$fid."|".$cut[1]."|".$cut[2]."|".$cut[3]."|".$cut[4]."|".$cut[5]."|".($cut[6]+1).PHP_EOL; $str = str_replace($line, $replace , $file); file_put_contents($path, $str); } } } }else if(strpos($file, "post-".$fid."|") === FALSE && is_numeric($fid) && is_numeric($viewed) && is_numeric($viewed_day) && is_numeric($viewed_week) && is_numeric($viewed_month) && is_numeric($liked) && is_numeric($disliked)){ $insert = trim("post-".$fid."|".($viewed+1)."|".($viewed_day+1)."|".($viewed_week+1)."|".($viewed_month+1)."|".$liked."|".$disliked).PHP_EOL; file_put_contents($path, $insert, FILE_APPEND); } } Các B xem giúp e với. Thank!!
Sao ko dùng json encode mấy var chúng nó cho sau này cho dễ đọc hơn không. Sau chỉ cần decode là nó ra array thì đọc update dễ hơn không ? Dùng redis chứ ai lưu vào txt vậy ko thì lưu vào 1 database riêng chứ
Em nhìn thấy pha xử lý của bác hơi cồng kềnh, và cũng chục năm không đụng nhiều php nên em cũng ngại comment. Nhìn chung thì có vẻ ý tưởng của bác như sau: Tạo 1 cái file view.txt và làm như 1 db để lưu thông tin về post Bác tạo cái hàm set_viewer, với tham số chính là post id, action Trong hàm đó, bác check file view.txt nếu không có chuỗi post-[id] thì thêm 1 dòng Nếu có chuỗi post-[id] bác mở file, sau đó lặn lội từng dòng để kiếm cái dòng có post id. Mỗi lần lặn lội là 1 lần ghi lại cái dòng vừa đọc sau khi kiếm được thì bác dựa vào action sau đó làm tùm lum tá lả Em cho rằng cách xử lý trên là chưa tốt, có thể nó bị đâu đó khi nhiều request thực hiện, step #4 sẽ đồng thời chạy trên nhiều luồng khác nhau, ghi cùng 1 lúc, không bị lock file thì cũng bị đè lung tung dữ liệu. Nếu bác đã cố theo cách này thì có thể dùng thêm lock https://www.php.net/manual/en/syncmutex.unlock.php , nhưng em nghĩ bác nên đập bỏ và viết lại bằng cách dùng 1 db gì đó, hoặc redis như bác @Phan Thị có nhắc, đó là hướng đẹp nhất rồi Cái này căn bản quá bác ghi cái tiêu đề phát khiếp làm ae muốn giúp cũng ngại ngại, hehe
em ngó qua thì thấy cũng dễ mà nhỉ, redis đâu có mấy hàm đâu Code: https://github.com/phpredis/phpredis#keys-getkeys
Trình code của e gà nên đang gặp khó khắn ở cái bước get redis key ra. B cho e xin telegram hoặc skype để nếu ko code đc e thuê bác luôn.
Mình thì thấy có vấn đề ở việc bạn chỉ có 1 file txt lưu cho nhiều post. Gặp trường hợp mà nhiều chỗ cùng gọi hàm này thì cái file txt của bạn bị chồng chéo dữ liệu là chắc.