반응형

글쓴이는 JS(React) + PHP(Laravel) 환경에서 주로 작업합니다

 

작업하면서 계속 추가할 예정 :-)

 

Code Spell Checker

오타방지용

 

ESLint

아직 잘 모르겠음.. 

 

Git Graph

GitLens도 설치는 해두었는데 개인적으로 이게 보기가 편해서 깃 로그볼 때 자주 사용함

 

Prettier - Code formatter

코드 줄 정리를 이쁘게 해주는 툴

 

TODO Highlight

TODO, FIXME 눈에 띄게 해주는 툴

 

 

 

PHP관련 툴은 아직 개인PC에는 설치하지 않았지만 작업 때 설치하는 툴들

PHP Intelephense

PHP IntelliSense

PHPUnit Test Explorer

반응형
반응형
$array = ['name' => 'kim', 'age' => 23];

이 배열에서 name 값을 변수에 담으려면 어떻게 해야할까

 

$name = $array['name'];

Arr::get의 존재를 알기전의 나는 이 코드를 답했을 것이다

 

하지만 만약 배열에 name 이라는 key가 존재하지 않는다면 exception이 터지기 때문에 예외처리를 해주어야한다.

만약 name이 존재하지 않을 때 null을 반환하고자 한다면 대충 아래와 같은 코드가 될 것

$name = array_key_exists('name', $array) ? $array['name'] : null;

 

하지만 Arr::get를 사용하면 해당 키가 없는 경우 알아서 null을 반환할수 있다

$name = Arr::get($array, 'name');

 

 

차이점은 챗지피티에게 물어보자

 

  • 존재 여부 검사:
    • Arr::get($array, 'name'): 이 메서드는 배열에서 지정된 키가 존재하는지 여부를 먼저 확인하고, 존재하지 않을 경우 기본값(null)을 반환합니다.
    • $array['name']: 이 문법은 바로 지정된 키에 해당하는 값을 가져옵니다. 하지만 해당 키가 배열 안에 없으면 PHP는 경고를 발생시키고, Undefined index 오류를 일으킬 수 있습니다.
  • 기본값 설정:
    • Arr::get($array, 'name', $defaultValue): 세 번째 인수를 제공하여 키가 존재하지 않을 때 반환할 기본값을 설정할 수 있습니다.
    • $array['name'] ?? $defaultValue: PHP 7 이상에서는 널 병합 연산자(??)를 사용하여 기본값을 설정할 수 있습니다.
  • 응용 프로그램 로직:
    • Arr::get을 사용하면 배열에서 값에 접근할 때 추가적인 로직을 적용하기 쉽습니다. 예를 들어, 데이터가 없을 때 기본값을 할당하거나, 특정 조건에 따라 다른 값을 반환하는 등의 처리를 할 수 있습니다.
    • $array['name']을 사용하면 단순히 배열에서 값을 직접적으로 가져오는 것이므로 추가적인 로직을 적용하기 어려울 수 있습니다.

 

반응형
반응형

쿼리 스코프(Query Scope)는 Laravel에서 데이터베이스 쿼리를 쉽게 작성하고 재사용할 수 있는 기능입니다. 주로 Eloquent 모델에서 정의되며, 특정 쿼리 조각이나 필터링 기준을 하나의 메서드로 묶어 사용할 수 있도록 도와줍니다.

쿼리 스코프를 사용하면 다음과 같은 이점이 있습니다:

1. **코드 재사용성**: 동일한 쿼리 조건이 여러 곳에서 필요할 때 매번 같은 쿼리를 반복해서 작성하는 것을 방지할 수 있습니다.

2. **가독성**: 코드를 읽고 이해하기 쉬워집니다. 독립적으로 정의된 쿼리 스코프는 모델을 사용하는 다른 부분과 분리됩니다.

3. **유지보수성**: 쿼리 스코프 내의 로직이 변경되면 모든 사용 사례에 자동으로 반영되므로 유지 보수가 용이합니다.

쿼리 스코프는 Laravel의 Eloquent 모델 클래스 내에서 `scope` 접두사로 정의됩니다. 예를 들어, 다음과 같이 정의할 수 있습니다:

```php
class CodeValue extends Model
{
    public function scopeCategoryKey($query, $categoryKey)
    {
        return $query->where('category_key', $categoryKey);
    }
}
```

위의 예제에서 `scopeCategoryKey` 메서드는 `$query` 파라미터를 받아서 데이터베이스 쿼리 빌더 객체를 나타내며, 이를 통해 원하는 조건을 추가할 수 있습니다. 이후에는 모델에서 다음과 같이 사용할 수 있습니다:

```php
$codeValue = CodeValue::categoryKey('accounting')->get();
```

이렇게 하면 'category_key'가 'accounting'인 모든 `CodeValue` 레코드를 가져올 수 있습니다. 쿼리 스코프를 사용하면 이러한 간단하고 반복적인 쿼리 작업을 효율적으로 관리할 수 있습니다.

반응형
반응형

서버가 죽어서 로그를 확인해보니 timeout으로 서버가 죽어 있었다

서버가 죽을때 restart 해주는 설정을 해주자

 

restart 설정은 no, always, on-sucess, on-failure, on-abnormal, on-abort, on-watchdog가 존재하는데

각각 restart 기준은 아래 comman드 실행시 나오는 문서의 Restart= 부분에서 확인 가능하다

$ LANG=C man systemd.service

예를 들어 no로 설정할 경우 재실행은 이루어지지 않으며, always로 설정시 모든 경우에서 재실행이 된다고 보면 된다

 

그럼 현재 내 서버는 어떤 설정인지 확인해보자

$ less /usr/lib/systemd/system/apache2.service

Restart 설정이 되어있지만 on-abort로 설정되어있다

즉 Unclean signal일 경우만 자동으로 재실행해주는것이다

timeout을 재실행 해주는 설정은 always, on-failure, on-abnormal

그 중 나는 on-failure로 설정해주겠다

 

apache2.service에서 수정해도 되지만 업데이트 등 변경될 가능성이 있기때문에

systemctl edit으로 내용을 재정의해준다

$ sudo systemctl edit apache2
### Editing /etc/systemd/system/apache2.service.d/override.conf
### Anything between here and the comment below will become the new contents of the file



### Lines below this comment will be discarded

### /lib/systemd/system/apache2.service
# [Unit]
# Description=The Apache HTTP Server
# After=network.target remote-fs.target nss-lookup.target
# Documentation=https://httpd.apache.org/docs/2.4/
#
# [Service]
# Type=forking
# Environment=APACHE_STARTED_BY_SYSTEMD=true
# ExecStart=/usr/sbin/apachectl start
# ExecStop=/usr/sbin/apachectl graceful-stop
# ExecReload=/usr/sbin/apachectl graceful
# KillMode=mixed
# PrivateTmp=true
Restart=on-failure
#
# [Install]
# WantedBy=multi-user.target

 

 

 

참고자료

https://www.netassist.ne.jp/techblog/29324/

 

不正終了するApacheを自動で起動させる|株式会社ネットアシスト

はじめにこんにちは、技術部のTUです!Apacheが夜間に勝手に不正終了してしまう、コマンドで起動は出来るし設定も間違っていないに・・・という事は無いでしょうか?そんな時に役立つsyste

www.netassist.ne.jp

반응형
반응형

mbstring을 찾을수 없어서 발생하는 문제로

난 Laravel에서 migration:refresh시 발생하였다

 

해결방법은 간단

 

php.ini 파일에서

extension=mbstring 주석을 해제하자

반응형

'PHP' 카테고리의 다른 글

[PHP] Install PHP  (0) 2023.12.30
반응형

우분투 환경에서 라라벨 프로젝트를 운영중이다

라라벨 로그는 /storage/logs에 저장이 되는데 config/logging.php에서 설정해준다

기본은 stack 이지만, 로그를 확인할때 일자별로 저장되는것이 관리가 편하기 때문에 이부분을 daily로 변경해줬다

 

@config/logging.php

 

이렇게 설정하면 로그 폴더에 아래와 같이 로그파일이 관리된다

 

와~~~~~~~~~ 간단하다

 

하고 끝냈지만 다음날 서버 접속시 500에러 발생

로그를 찾아보니 permission denied 오류가 발생했는데

원인은 위의 일자별 로그파일의 Owner, Group이 www-data가 아닌 유저로 할당되어 www-data의 권한이 없기 때문이다

 

급하게 chown 으로 로그파일 권한설정을 변경해서 고쳤지만

매번 권한설정을 바꾸는거는 바보같은짓이고

자정에 chown으로 권한설정을 바꾸도록 크론탭 설정하는것도 썩 좋은방법은 아닐거같았다

(DB는 크론탭으로 백업하고 있으니까 라라벨도 크론탭으로 백업하는게 좋은걸까 라는 생각도 들기도하고.....휴)

 

무튼 찾다가 보니 아래와 같은 방법이 있어서 시도해봄

 

@config/logging.php

        'daily' => [
            'driver' => 'daily',
	    //'path' => storage_path('logs/laravel.log'),
	    'path' => storage_path('logs/laravel-'.php_sapi_name().'.log'),
            'level' => env('LOG_LEVEL', 'debug'),
            'days' => 14,
            'permission' => 0664,
        ],

 

일단 뭔진 모르겠지만 이렇게 설정해보았다

다음날 로그파일 확인시 아래와같이 일자별로 두개 파일이 생성된것을 확인했다

위의 laravel-apache2handler 파일은 Owner, Group이 www-data이고

laravel-cli 파일은 서버유저가 Owner, Group

 

 

그래서 저게 뭔지 알아보자

  • php_sapi_name
    PHP가 사용하고 있는 인터페이스(서버 API, SAPI)의 형을 소문자 문자열로 반환합니다. 예를들어, CLI판의 PHP는 "cli"가 된다. Apache와 함께 사용하는 경우, 실제 사용하고 있는 SAPI에 대해 여러 결과가 반환된다.

나의 경우 cli가 반환된거 보니 CLI판의 PHP인것으로 추정되는데 php -v 커맨드에서 확인할수 있었다

  • CLI : Command Line Interface의 약어로 시스템 명령줄에서 PHP를 사용하는 방법, CGI도 있는데 대부분 CLI를 사용한다고 한다. 차이점은 궁금하면 찾아보시길

 

일단 이렇게 마무리하려고 한다

파일이 두개 생기는 부담은 있지만

더 좋은 방법을 찾으면 업데이트 하는걸로~

 

참고자료

https://qiita.com/meiyin/items/1ffafb22854dcef06f98

 

Logファイルの権限エラーの解決方法(Laravel) - Qiita

プログラミング初心者です##環境Laravel 5.8PHP 7.3.29AWS EC2 にてデプロイ##問題データ処理送信を行う際、loggerメソッドでlogを記載しようとしたが、当…

qiita.com

https://www.php.net/manual/ja/function.php-sapi-name.php

 

PHP: php_sapi_name - Manual

The php_sapi_name() function is extremely useful when you want to determine the type of interface. There is, however, one more gotcha you need to be aware of while designing your application or deploying it to an unknown server.Whenever something depends o

www.php.net

 

반응형
반응형

SPA라면 사이드바를 열고 닫는것에 문제가 없겠지만

페이지 이동이 있는 사이트의 경우 사이드바를 닫아두어도 디폴드가 열려있다면 이동시에도 열린것을 확인할수있다

이를 저장하기 위해 JS에서 'sidebar'라는 쿠키값을 설정하였다

$(document).ready(function(){
    const sidebar = $('.sidebar');
    const toggle = $(".toggle");

    rememberCookie(sidebar);
    toggle.on("click" , () =>{
        if($.cookie('sidebar')==='close') {
            $.cookie('sidebar', 'open', {path: '/'});
        } else {
            $.cookie('sidebar', 'close', {path: '/'});
        }
        rememberCookie(sidebar);
    });
});

function rememberCookie(sidebar){
    if($.cookie('sidebar')==='close') {
        sidebar.addClass("close");
    } else {
        sidebar.removeClass("close");
    }
}

 

이 쿠키값으로 blade view에서 값을 불러오고 싶었다

이럴땐 의외로 매우 간단하게 미들웨어에 쿠키이름만 설정 해주면된다

 

@app/Http/Middleware/EncryptCookies.php

<?php

namespace App\Http\Middleware;

use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;

class EncryptCookies extends Middleware
{
    /**
     * The names of the cookies that should not be encrypted.
     *
     * @var array<int, string>
     */
    protected $except = [
        'sidebar'
    ];
}

 

설정 후 blade에서 쿠키 값을 확인할수 있다

{{ Cookie::get('sidebar'); }}
 
반응형

+ Recent posts