Nhờ các cao thủ code giúp

Discussion in 'Hỏi Đáp Kỹ Thuật' started by laogiavn, Nov 24, 2021.

  1. laogiavn

    laogiavn Sơ Nhập Giang Hồ

    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!!
     
    Last edited: Nov 24, 2021
  2. Nai

    Nai MiddleMan Staff Member

    Thớt có thể giải thích về hàm này có chức năng gì ko
     
  3. laogiavn

    laogiavn Sơ Nhập Giang Hồ

    À e update view vào 1 file txt.
    Action = view nó sẽ + vào view
    Action = like nó sẽ + vào like
     
  4. xmenvn2510

    xmenvn2510 Moderator + MiddleMan Staff Member

    Gọi bồ @sincos hoặc @firefox , chứ a đọc thấy rối quá . {big_smile}{big_smile}
     
    laogiavn likes this.
  5. Phan Thị

    Phan Thị Bang Chúng

    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ứ
     
  6. laogiavn

    laogiavn Sơ Nhập Giang Hồ

    Dùng redis e gặp khó khăn cái đoạn call key để get view nên chưa làm đc.
     
  7. firefox

    firefox Bang Chúng

    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:
    1. Tạo 1 cái file view.txt và làm như 1 db để lưu thông tin về post
    2. Bác tạo cái hàm set_viewer, với tham số chính là post id, action
    3. Trong hàm đó, bác check file view.txt nếu không có chuỗi post-[id] thì thêm 1 dòng
    4. 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
    5. 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 {byebye}
     
    laogiavn likes this.
  8. Phan Thị

    Phan Thị Bang Chúng

    Đoạn nào lỗi thì post ra đây , nó có mỗi get set thôi mà có gì mà khó đâu
     
  9. firefox

    firefox Bang Chúng

    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
     
    laogiavn likes this.
  10. laogiavn

    laogiavn Sơ Nhập Giang Hồ

    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.
     
  11. Tạ hơi nặng

    Tạ hơi nặng Bang Chúng

    Thuê bác cáo chắc tiền tấn hihi
     
    laogiavn likes this.
  12. firefox

    firefox Bang Chúng

    em chỉ code những thứ e thích và luôn free. php em không rành bác kiếm người khác đi ạ {byebye}
     
  13. Phan Thị

    Phan Thị Bang Chúng

    Mình định giúp nhưng nó ko like mình nên lại thôi haha
     
    TheLooter, laogiavn and firefox like this.
  14. Nai

    Nai MiddleMan Staff Member

    Chắc tiền Tạ là đủ rồi cụ à {byebye}
     
  15. aidamcuoianh

    aidamcuoianh Khách Qua Đường

    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.
     
    laogiavn likes this.