Helpers, PHP 함수 설명

Helpers

Introduction

Laravel includes a variety of global “helper” PHP functions. Many of these functions are used by the framework itself; however, you are free to use them in your own applications if you find them convenient.

Available Methods

Arrays & Objects

Paths

Strings

URLs

Miscellaneous

Method Listing

Arrays & Objects

array_add()

The array_add function adds a given key / value pair to an array if the given key doesn’t already exist in the array:

$array = array_add(['name' => 'Desk'], 'price', 100);

// ['name' => 'Desk', 'price' => 100]

array_collapse()

The array_collapse function collapses an array of arrays into a single array:

$array = array_collapse([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);

// [1, 2, 3, 4, 5, 6, 7, 8, 9]

array_divide()

The array_divide function returns two arrays, one containing the keys, and the other containing the values of the given array:

[$keys, $values] = array_divide(['name' => 'Desk']);

// $keys: ['name']

// $values: ['Desk']

array_dot()

The array_dot function flattens a multi-dimensional array into a single level array that uses “dot” notation to indicate depth:

$array = ['products' => ['desk' => ['price' => 100]]];

$flattened = array_dot($array);

// ['products.desk.price' => 100]

array_except()

The array_except function removes the given key / value pairs from an array:

$array = ['name' => 'Desk', 'price' => 100];

$filtered = array_except($array, ['price']);

// ['name' => 'Desk']

array_first()

The array_first function returns the first element of an array passing a given truth test:

$array = [100, 200, 300];

$first = array_first($array, function ($value, $key) {
    return $value >= 150;
});

// 200

A default value may also be passed as the third parameter to the method. This value will be returned if no value passes the truth test:

$first = array_first($array, $callback, $default);

array_flatten()

The array_flatten function flattens a multi-dimensional array into a single level array:

$array = ['name' => 'Joe', 'languages' => ['PHP', 'Ruby']];

$flattened = array_flatten($array);

// ['Joe', 'PHP', 'Ruby']

array_forget()

The array_forget function removes a given key / value pair from a deeply nested array using “dot” notation:

$array = ['products' => ['desk' => ['price' => 100]]];

array_forget($array, 'products.desk');

// ['products' => []]

array_get()

The array_get function retrieves a value from a deeply nested array using “dot” notation:

$array = ['products' => ['desk' => ['price' => 100]]];

$price = array_get($array, 'products.desk.price');

// 100

The array_get function also accepts a default value, which will be returned if the specific key is not found:

$discount = array_get($array, 'products.desk.discount', 0);

// 0

array_has()

The array_has function checks whether a given item or items exists in an array using “dot” notation:

$array = ['product' => ['name' => 'Desk', 'price' => 100]];

$contains = array_has($array, 'product.name');

// true

$contains = array_has($array, ['product.price', 'product.discount']);

// false

array_last()

The array_last function returns the last element of an array passing a given truth test:

$array = [100, 200, 300, 110];

$last = array_last($array, function ($value, $key) {
    return $value >= 150;
});

// 300

A default value may be passed as the third argument to the method. This value will be returned if no value passes the truth test:

$last = array_last($array, $callback, $default);

array_only()

The array_only function returns only the specified key / value pairs from the given array:

$array = ['name' => 'Desk', 'price' => 100, 'orders' => 10];

$slice = array_only($array, ['name', 'price']);

// ['name' => 'Desk', 'price' => 100]

array_pluck()

The array_pluck function retrieves all of the values for a given key from an array:

$array = [
    ['developer' => ['id' => 1, 'name' => 'Taylor']],
    ['developer' => ['id' => 2, 'name' => 'Abigail']],
];

$names = array_pluck($array, 'developer.name');

// ['Taylor', 'Abigail']

You may also specify how you wish the resulting list to be keyed:

$names = array_pluck($array, 'developer.name', 'developer.id');

// [1 => 'Taylor', 2 => 'Abigail']

array_prepend()

The array_prepend function will push an item onto the beginning of an array:

$array = ['one', 'two', 'three', 'four'];

$array = array_prepend($array, 'zero');

// ['zero', 'one', 'two', 'three', 'four']

If needed, you may specify the key that should be used for the value:

$array = ['price' => 100];

$array = array_prepend($array, 'Desk', 'name');

// ['name' => 'Desk', 'price' => 100]

array_pull()

The array_pull function returns and removes a key / value pair from an array:

$array = ['name' => 'Desk', 'price' => 100];

$name = array_pull($array, 'name');

// $name: Desk

// $array: ['price' => 100]

A default value may be passed as the third argument to the method. This value will be returned if the key doesn’t exist:

$value = array_pull($array, $key, $default);

array_random()

The array_random function returns a random value from an array:

$array = [1, 2, 3, 4, 5];

$random = array_random($array);

// 4 - (retrieved randomly)

You may also specify the number of items to return as an optional second argument. Note that providing this argument will return an array, even if only one item is desired:

$items = array_random($array, 2);

// [2, 5] - (retrieved randomly)

array_set()

The array_set function sets a value within a deeply nested array using “dot” notation:

$array = ['products' => ['desk' => ['price' => 100]]];

array_set($array, 'products.desk.price', 200);

// ['products' => ['desk' => ['price' => 200]]]

array_sort()

The array_sort function sorts an array by its values:

$array = ['Desk', 'Table', 'Chair'];

$sorted = array_sort($array);

// ['Chair', 'Desk', 'Table']

You may also sort the array by the results of the given Closure:

$array = [
    ['name' => 'Desk'],
    ['name' => 'Table'],
    ['name' => 'Chair'],
];

$sorted = array_values(array_sort($array, function ($value) {
    return $value['name'];
}));

/*
    [
        ['name' => 'Chair'],
        ['name' => 'Desk'],
        ['name' => 'Table'],
    ]
*/

array_sort_recursive()

The array_sort_recursive function recursively sorts an array using the sort function for numeric sub=arrays and ksort for associative sub-arrays:

$array = [
    ['Roman', 'Taylor', 'Li'],
    ['PHP', 'Ruby', 'JavaScript'],
    ['one' => 1, 'two' => 2, 'three' => 3],
];

$sorted = array_sort_recursive($array);

/*
    [
        ['JavaScript', 'PHP', 'Ruby'],
        ['one' => 1, 'three' => 3, 'two' => 2],
        ['Li', 'Roman', 'Taylor'],
    ]
*/

array_where()

The array_where function filters an array using the given Closure:

$array = [100, '200', 300, '400', 500];

$filtered = array_where($array, function ($value, $key) {
    return is_string($value);
});

// [1 => '200', 3 => '400']

array_wrap()

The array_wrap function wraps the given value in an array. If the given value is already an array it will not be changed:

$string = 'Laravel';

$array = array_wrap($string);

// ['Laravel']

If the given value is null, an empty array will be returned:

$nothing = null;

$array = array_wrap($nothing);

// []

data_fill()

The data_fill function sets a missing value within a nested array or object using “dot” notation:

$data = ['products' => ['desk' => ['price' => 100]]];

data_fill($data, 'products.desk.price', 200);

// ['products' => ['desk' => ['price' => 100]]]

data_fill($data, 'products.desk.discount', 10);

// ['products' => ['desk' => ['price' => 100, 'discount' => 10]]]

This function also accepts asterisks as wildcards and will fill the target accordingly:

$data = [
    'products' => [
        ['name' => 'Desk 1', 'price' => 100],
        ['name' => 'Desk 2'],
    ],
];

data_fill($data, 'products.*.price', 200);

/*
    [
        'products' => [
            ['name' => 'Desk 1', 'price' => 100],
            ['name' => 'Desk 2', 'price' => 200],
        ],
    ]
*/

data_get()

The data_get function retrieves a value from a nested array or object using “dot” notation:

$data = ['products' => ['desk' => ['price' => 100]]];

$price = data_get($data, 'products.desk.price');

// 100

The data_get function also accepts a default value, which will be returned if the specified key is not found:

$discount = data_get($data, 'products.desk.discount', 0);

// 0

The function also accepts wildcards using asterisks, which may target any key of the array or object:

$data = [
    'product-one' => ['name' => 'Desk 1', 'price' => 100],
    'product-two' => ['name' => 'Desk 2', 'price' => 150],
];

data_get($data, '*.name');

// ['Desk 1', 'Desk 2'];

data_set()

The data_set function sets a value within a nested array or object using “dot” notation:

$data = ['products' => ['desk' => ['price' => 100]]];

data_set($data, 'products.desk.price', 200);

// ['products' => ['desk' => ['price' => 200]]]

This function also accepts wildcards and will set values on the target accordingly:

$data = [
    'products' => [
        ['name' => 'Desk 1', 'price' => 100],
        ['name' => 'Desk 2', 'price' => 150],
    ],
];

data_set($data, 'products.*.price', 200);

/*
    [
        'products' => [
            ['name' => 'Desk 1', 'price' => 200],
            ['name' => 'Desk 2', 'price' => 200],
        ],
    ]
*/

By default, any existing values are overwritten. If you wish to only set a value if it doesn’t exist, you may pass false as the third argument:

$data = ['products' => ['desk' => ['price' => 100]]];

data_set($data, 'products.desk.price', 200, false);

// ['products' => ['desk' => ['price' => 100]]]

head()

The head function returns the first element in the given array:

$array = [100, 200, 300];

$first = head($array);

// 100

last()

The last function returns the last element in the given array:

$array = [100, 200, 300];

$last = last($array);

// 300

Paths

app_path()

The app_path function returns the fully qualified path to the app directory. You may also use the app_path function to generate a fully qualified path to a file relative to the application directory:

$path = app_path();

$path = app_path('Http/Controllers/Controller.php');

base_path()

The base_path function returns the fully qualified path to the project root. You may also use the base_path function to generate a fully qualified path to a given file relative to the project root directory:

$path = base_path();

$path = base_path('vendor/bin');

config_path()

The config_path function returns the fully qualified path to the config directory. You may also use the config_path function to generate a fully qualified path to a given file within the application’s configuration directory:

$path = config_path();

$path = config_path('app.php');

database_path()

The database_path function returns the fully qualified path to the database directory. You may also use the database_path function to generate a fully qualified path to a given file within the database directory:

$path = database_path();

$path = database_path('factories/UserFactory.php');

mix()

The mix function returns the path to a versioned Mix file:

$path = mix('css/app.css');

public_path()

The public_path function returns the fully qualified path to the public directory. You may also use the public_path function to generate a fully qualified path to a given file within the public directory:

$path = public_path();

$path = public_path('css/app.css');

resource_path()

The resource_path function returns the fully qualified path to the resources directory. You may also use the resource_path function to generate a fully qualified path to a given file within the resources directory:

$path = resource_path();

$path = resource_path('sass/app.scss');

storage_path()

The storage_path function returns the fully qualified path to the storage directory. You may also use the storage_path function to generate a fully qualified path to a given file within the storage directory:

$path = storage_path();

$path = storage_path('app/file.txt');

Strings

__()

The __ function translates the given translation string or translation key using your localization files:

echo __('Welcome to our application');

echo __('messages.welcome');

If the specified translation string or key does not exist, the __ function will return the given value. So, using the example above, the __ function would return messages.welcome if that translation key does not exist.

camel_case()

The camel_case function converts the given string to camelCase:

$converted = camel_case('foo_bar');

// fooBar

class_basename()

The class_basename returns the class name of the given class with the class’ namespace removed:

$class = class_basename('Foo\Bar\Baz');

// Baz

e()

The e function runs PHP’s htmlspecialchars function with the double_encode option set to true by default:

echo e('<html>foo</html>');

// &lt;html&gt;foo&lt;/html&gt;

ends_with()

The ends_with function determines if the given string ends with the given value:

$result = ends_with('This is my name', 'name');

// true

kebab_case()

The kebab_case function converts the given string to kebab-case:

$converted = kebab_case('fooBar');

// foo-bar

preg_replace_array()

The preg_replace_array function replaces a given pattern in the string sequentially using an array:

$string = 'The event will take place between :start and :end';

$replaced = preg_replace_array('/:[a-z_]+/', ['8:30', '9:00'], $string);

// The event will take place between 8:30 and 9:00

snake_case()

The snake_case function converts the given string to snake_case:

$converted = snake_case('fooBar');

// foo_bar

starts_with()

The starts_with function determines if the given string begins with the given value:

$result = starts_with('This is my name', 'This');

// true

str_after()

The str_after function returns everything after the given value in a string:

$slice = str_after('This is my name', 'This is');

// ' my name'

str_before()

The str_before function returns everything before the given value in a string:

$slice = str_before('This is my name', 'my name');

// 'This is '

str_contains()

The str_contains function determines if the given string contains the given value (case sensitive):

$contains = str_contains('This is my name', 'my');

// true

You may also pass an array of values to determine if the given string contains any of the values:

$contains = str_contains('This is my name', ['my', 'foo']);

// true

str_finish()

The str_finish function adds a single instance of the given value to a string if it does not already end with the value:

$adjusted = str_finish('this/string', '/');

// this/string/

$adjusted = str_finish('this/string/', '/');

// this/string/

str_is()

The str_is function determines if a given string matches a given pattern. Asterisks may be used to indicate wildcards:

$matches = str_is('foo*', 'foobar');

// true

$matches = str_is('baz*', 'foobar');

// false

str_limit()

The str_limit function truncates the given string at the specified length:

$truncated = str_limit('The quick brown fox jumps over the lazy dog', 20);

// The quick brown fox...

You may also pass a third argument to change the string that will be appended to the end:

$truncated = str_limit('The quick brown fox jumps over the lazy dog', 20, ' (...)');

// The quick brown fox (...)

Str::orderedUuid()

The Str::orderedUuid method generates a “timestamp first” UUID that may be efficiently stored in an indexed database column:

use Illuminate\Support\Str;

return (string) Str::orderedUuid();

str_plural()

The str_plural function converts a string to its plural form. This function currently only supports the English language:

$plural = str_plural('car');

// cars

$plural = str_plural('child');

// children

You may provide an integer as a second argument to the function to retrieve the singular or plural form of the string:

$plural = str_plural('child', 2);

// children

$plural = str_plural('child', 1);

// child

str_random()

The str_random function generates a random string of the specified length. This function uses PHP’s random_bytes function:

$random = str_random(40);

str_replace_array()

The str_replace_array function replaces a given value in the string sequentially using an array:

$string = 'The event will take place between ? and ?';

$replaced = str_replace_array('?', ['8:30', '9:00'], $string);

// The event will take place between 8:30 and 9:00

str_replace_first()

The str_replace_first function replaces the first occurrence of a given value in a string:

$replaced = str_replace_first('the', 'a', 'the quick brown fox jumps over the lazy dog');

// a quick brown fox jumps over the lazy dog

str_replace_last()

The str_replace_last function replaces the last occurrence of a given value in a string:

$replaced = str_replace_last('the', 'a', 'the quick brown fox jumps over the lazy dog');

// the quick brown fox jumps over a lazy dog

str_singular()

The str_singular function converts a string to its singular form. This function currently only supports the English language:

$singular = str_singular('cars');

// car

$singular = str_singular('children');

// child

str_slug()

The str_slug function generates a URL friendly “slug” from the given string:

$slug = str_slug('Laravel 5 Framework', '-');

// laravel-5-framework

str_start()

The str_start function adds a single instance of the given value to a string if it does not already start with the value:

$adjusted = str_start('this/string', '/');

// /this/string

$adjusted = str_start('/this/string', '/');

// /this/string

studly_case()

The studly_case function converts the given string to StudlyCase:

$converted = studly_case('foo_bar');

// FooBar

title_case()

The title_case function converts the given string to Title Case:

$converted = title_case('a nice title uses the correct case');

// A Nice Title Uses The Correct Case

trans()

The trans function translates the given translation key using your localization files:

echo trans('messages.welcome');

If the specified translation key does not exist, the trans function will return the given key. So, using the example above, the trans function would return messages.welcome if the translation key does not exist.

trans_choice()

The trans_choice function translates the given translation key with inflection:

echo trans_choice('messages.notifications', $unreadCount);

If the specified translation key does not exist, the trans_choice function will return the given key. So, using the example above, the trans_choice function would return messages.notifications if the translation key does not exist.

Str::uuid()

The Str::uuid method generates a UUID (version 4):

use Illuminate\Support\Str;

return (string) Str::uuid();

URLs

action()

The action function generates a URL for the given controller action. You do not need to pass the full namespace of the controller. Instead, pass the controller class name relative to the App\Http\Controllers namespace:

$url = action('HomeController@index');

$url = action([HomeController::class, 'index']);

If the method accepts route parameters, you may pass them as the second argument to the method:

$url = action('UserController@profile', ['id' => 1]);

asset()

The asset function generates a URL for an asset using the current scheme of the request (HTTP or HTTPS):

$url = asset('img/photo.jpg');

secure_asset()

The secure_asset function generates a URL for an asset using HTTPS:

$url = secure_asset('img/photo.jpg');

route()

The route function generates a URL for the given named route:

$url = route('routeName');

If the route accepts parameters, you may pass them as the second argument to the method:

$url = route('routeName', ['id' => 1]);

By default, the route function generates an absolute URL. If you wish to generate a relative URL, you may pass false as the third argument:

$url = route('routeName', ['id' => 1], false);

secure_url()

The secure_url function generates a fully qualified HTTPS URL to the given path:

$url = secure_url('user/profile');

$url = secure_url('user/profile', [1]);

url()

The url function generates a fully qualified URL to the given path:

$url = url('user/profile');

$url = url('user/profile', [1]);

If no path is provided, a Illuminate\Routing\UrlGenerator instance is returned:

$current = url()->current();

$full = url()->full();

$previous = url()->previous();

Miscellaneous

abort()

The abort function throws an HTTP exception which will be rendered by the exception handler:

abort(403);

You may also provide the exception’s response text and custom response headers:

abort(403, 'Unauthorized.', $headers);

abort_if()

The abort_if function throws an HTTP exception if a given boolean expression evaluates to true:

abort_if(! Auth::user()->isAdmin(), 403);

Like the abort method, you may also provide the exception’s response text as the third argument and an array of custom response headers as the fourth argument.

abort_unless()

The abort_unless function throws an HTTP exception if a given boolean expression evaluates to false:

abort_unless(Auth::user()->isAdmin(), 403);

Like the abort method, you may also provide the exception’s response text as the third argument and an array of custom response headers as the fourth argument.

app()

The app function returns the service container instance:

$container = app();

You may pass a class or interface name to resolve it from the container:

$api = app('HelpSpot\API');

auth()

The auth function returns an authenticator instance. You may use it instead of the Authfacade for convenience:

$user = auth()->user();

If needed, you may specify which guard instance you would like to access:

$user = auth('admin')->user();

back()

The back function generates a redirect HTTP response to the user’s previous location:

return back($status = 302, $headers = [], $fallback = false);

return back();

bcrypt()

The bcrypt function hashes the given value using Bcrypt. You may use it as an alternative to the Hash facade:

$password = bcrypt('my-secret-password');

broadcast()

The broadcast function broadcasts the given event to its listeners:

broadcast(new UserRegistered($user));

blank()

The blank function returns whether the given value is “blank”:

blank('');
blank('   ');
blank(null);
blank(collect());

// true

blank(0);
blank(true);
blank(false);

// false

For the inverse of blank, see the filled method.

cache()

The cache function may be used to get values from the cache. If the given key does not exist in the cache, an optional default value will be returned:

$value = cache('key');

$value = cache('key', 'default');

You may add items to the cache by passing an array of key / value pairs to the function. You should also pass the number of minutes or duration the cached value should be considered valid:

cache(['key' => 'value'], 5);

cache(['key' => 'value'], now()->addSeconds(10));

class_uses_recursive()

The class_uses_recursive function returns all traits used by a class, including traits used by all of its parent classes:

$traits = class_uses_recursive(App\User::class);

collect()

The collect function creates a collection instance from the given value:

$collection = collect(['taylor', 'abigail']);

config()

The config function gets the value of a configuration variable. The configuration values may be accessed using “dot” syntax, which includes the name of the file and the option you wish to access. A default value may be specified and is returned if the configuration option does not exist:

$value = config('app.timezone');

$value = config('app.timezone', $default);

You may set configuration variables at runtime by passing an array of key / value pairs:

config(['app.debug' => true]);

cookie()

The cookie function creates a new cookie instance:

$cookie = cookie('name', 'value', $minutes);

csrf_field()

The csrf_field function generates an HTML hidden input field containing the value of the CSRF token. For example, using Blade syntax:

{{ csrf_field() }}

csrf_token()

The csrf_token function retrieves the value of the current CSRF token:

$token = csrf_token();

dd()

The dd function dumps the given variables and ends execution of the script:

dd($value);

dd($value1, $value2, $value3, ...);

If you do not want to halt the execution of your script, use the dump function instead.

decrypt()

The decrypt function decrypts the given value using Laravel’s encrypter:

$decrypted = decrypt($encrypted_value);

dispatch()

The dispatch function pushes the given job onto the Laravel job queue:

dispatch(new App\Jobs\SendEmails);

dispatch_now()

The dispatch_now function runs the given job immediately and returns the value from its handle method:

$result = dispatch_now(new App\Jobs\SendEmails);

dump()

The dump function dumps the given variables:

dump($value);

dump($value1, $value2, $value3, ...);

If you want to stop executing the script after dumping the variables, use the dd function instead.

You may use Artisan’s dump-server command to intercept all dump calls and display them in your console window instead of your browser.

encrypt()

The encrypt function encrypts the given value using Laravel’s encrypter:

$encrypted = encrypt($unencrypted_value);

env()

The env function retrieves the value of an environment variable or returns a default value:

$env = env('APP_ENV');

// Returns 'production' if APP_ENV is not set...
$env = env('APP_ENV', 'production');

If you execute the config:cache command during your deployment process, you should be sure that you are only calling the env function from within your configuration files. Once the configuration has been cached, the .env file will not be loaded and all calls to the env function will return null.

event()

The event function dispatches the given event to its listeners:

event(new UserRegistered($user));

factory()

The factory function creates a model factory builder for a given class, name, and amount. It can be used while testing or seeding:

$user = factory(App\User::class)->make();

filled()

The filled function returns whether the given value is not “blank”:

filled(0);
filled(true);
filled(false);

// true

filled('');
filled('   ');
filled(null);
filled(collect());

// false

For the inverse of filled, see the blank method.

info()

The info function will write information to the log:

info('Some helpful information!');

An array of contextual data may also be passed to the function:

info('User login attempt failed.', ['id' => $user->id]);

logger()

The logger function can be used to write a debug level message to the log:

logger('Debug message');

An array of contextual data may also be passed to the function:

logger('User has logged in.', ['id' => $user->id]);

logger instance will be returned if no value is passed to the function:

logger()->error('You are not allowed here.');

method_field()

The method_field function generates an HTML hidden input field containing the spoofed value of the form’s HTTP verb. For example, using Blade syntax:

<form method="POST">
    {{ method_field('DELETE') }}
</form>

now()

The now function creates a new Illuminate\Support\Carbon instance for the current time:

$now = now();

old()

The old function retrieves an old input value flashed into the session:

$value = old('value');

$value = old('value', 'default');

optional()

The optional function accepts any argument and allows you to access properties or call methods on that object. If the given object is null, properties and methods will return nullinstead of causing an error:

return optional($user->address)->street;

{!! old('name', optional($user)->name) !!}

The optional function also accepts a Closure as its second argument. The Closure will be invoked if the value provided as the first argument is not null:

return optional(User::find($id), function ($user) {
    return new DummyUser;
});

policy()

The policy method retrieves a policy instance for a given class:

$policy = policy(App\User::class);

redirect()

The redirect function returns a redirect HTTP response, or returns the redirector instance if called with no arguments:

return redirect($to = null, $status = 302, $headers = [], $secure = null);

return redirect('/home');

return redirect()->route('route.name');

report()

The report function will report an exception using your exception handler‘s report method:

report($e);

request()

The request function returns the current request instance or obtains an input item:

$request = request();

$value = request('key', $default);

rescue()

The rescue function executes the given Closure and catches any exceptions that occur during its execution. All exceptions that are caught will be sent to your exception handler‘s reportmethod; however, the request will continue processing:

return rescue(function () {
    return $this->method();
});

You may also pass a second argument to the rescue function. This argument will be the “default” value that should be returned if an exception occurs while executing the Closure:

return rescue(function () {
    return $this->method();
}, false);

return rescue(function () {
    return $this->method();
}, function () {
    return $this->failure();
});

resolve()

The resolve function resolves a given class or interface name to its instance using the service container:

$api = resolve('HelpSpot\API');

response()

The response function creates a response instance or obtains an instance of the response factory:

return response('Hello World', 200, $headers);

return response()->json(['foo' => 'bar'], 200, $headers);

retry()

The retry function attempts to execute the given callback until the given maximum attempt threshold is met. If the callback does not throw an exception, its return value will be returned. If the callback throws an exception, it will automatically be retried. If the maximum attempt count is exceeded, the exception will be thrown:

return retry(5, function () {
    // Attempt 5 times while resting 100ms in between attempts...
}, 100);

session()

The session function may be used to get or set session values:

$value = session('key');

You may set values by passing an array of key / value pairs to the function:

session(['chairs' => 7, 'instruments' => 3]);

The session store will be returned if no value is passed to the function:

$value = session()->get('key');

session()->put('key', $value);

tap()

The tap function accepts two arguments: an arbitrary $value and a Closure. The $value will be passed to the Closure and then be returned by the tap function. The return value of the Closure is irrelevant:

$user = tap(User::first(), function ($user) {
    $user->name = 'taylor';

    $user->save();
});

If no Closure is passed to the tap function, you may call any method on the given $value. The return value of the method you call will always be $value, regardless of what the method actually returns in its definition. For example, the Eloquent update method typically returns an integer. However, we can force the method to return the model itself by chaining the updatemethod call through the tap function:

$user = tap($user)->update([
    'name' => $name,
    'email' => $email,
]);

today()

The today function creates a new Illuminate\Support\Carbon instance for the current date:

$today = today();

throw_if()

The throw_if function throws the given exception if a given boolean expression evaluates to true:

throw_if(! Auth::user()->isAdmin(), AuthorizationException::class);

throw_if(
    ! Auth::user()->isAdmin(),
    AuthorizationException::class,
    'You are not allowed to access this page'
);

throw_unless()

The throw_unless function throws the given exception if a given boolean expression evaluates to false:

throw_unless(Auth::user()->isAdmin(), AuthorizationException::class);

throw_unless(
    Auth::user()->isAdmin(),
    AuthorizationException::class,
    'You are not allowed to access this page'
);

trait_uses_recursive()

The trait_uses_recursive function returns all traits used by a trait:

$traits = trait_uses_recursive(\Illuminate\Notifications\Notifiable::class);

transform()

The transform function executes a Closure on a given value if the value is not blank and returns the result of the Closure:

$callback = function ($value) {
    return $value * 2;
};

$result = transform(5, $callback);

// 10

A default value or Closure may also be passed as the third parameter to the method. This value will be returned if the given value is blank:

$result = transform(null, $callback, 'The value is blank');

// The value is blank

validator()

The validator function creates a new validator instance with the given arguments. You may use it instead of the Validator facade for convenience:

$validator = validator($data, $rules, $messages);

value()

The value function returns the value it is given. However, if you pass a Closure to the function, the Closure will be executed then its result will be returned:

$result = value(true);

// true

$result = value(function () {
    return false;
});

// false

view()

The view function retrieves a view instance:

return view('auth.login');

with()

The with function returns the value it is given. If a Closure is passed as the second argument to the function, the Closure will be executed and its result will be returned:

$callback = function ($value) {
    return (is_numeric($value)) ? $value * 2 : 0;
};

$result = with(5, $callback);

// 10

$result = with(null, $callback);

// 0

$result = with(5, null);

// 5

centos 7 , phython3.7 설치방법

How to Install Python 3.7.0 on CentOS/RHEL 7/6 & Fedora 28-23

Python is a powerful programming language. It is very friendly and easy to learn. At writing time of this article Python 3.7.0 latest stable version is available to download and install. This tutorial will help you to install Python 3.7.0 on your CentOS, Red Hat & Fedora operating systems.

Step 1 – Requirements

This Python installation required GCC compiler on your system. Login to your server using ssh or shell access. Now, use the following command to install prerequisites for Python before installing it.

yum install gcc openssl-devel bzip2-devel

Step 2 – Download Python 3.7

Download Python using the following command from python official site. You can also download the latest version in place of specified below.

cd /usr/src
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz

Now extract the downloaded package.

tar xzf Python-3.7.0.tgz

Step 3 – Install Python 3.7

Use below set of commands to compile Python source code on your system using altinstall.

cd Python-3.7.0
./configure --enable-optimizations
make altinstall

make altinstall is used to prevent replacing the default python binary file /usr/bin/python.

Now remove downloaded source archive file from your system

rm /usr/src/Python-3.7.0.tgz

Step 4 – Check Python Version

Check the latest version installed of python. Use command python3.7 instead of just python.

python3.7 -V

Python 3.7.0

php를 최적화해서 사용하는 방법

가끔 PHP로 웹페이지를 작성할 일이 있는데, 유용한 팁을 우연히 보게 되어 한글로 옮겨적어본다.
원본은 40 Tips for optimizing your php Code

1. If a method can be static, declare it static. Speed improvement is by a factor of 4.
메쏘드가 static이 될 수 있다면 static으로 선언하라. 4배 빨라진다.

2. echo is faster than print.
echo가 print보다 빠르다.

3. Use echo’s multiple parameters instead of string concatenation.
문자열을 이어붙이지 말고, echo를 이용하여 여러 개의 파라미터를 적어라.

4. Set the maxvalue for your for-loops before and not in the loop.
for 루프을 위핸 최대값(탈출조건)을 루프 안에서가 아니고 루프 시작 이전에 지정하라.

5. Unset your variables to free memory, especially large arrays.
메모리를 해제하기 위해 변수를 unset하라. 특히 커다란 배열은 그래야 된다.

6. Avoid magic like __get, __set, __autoload
__get, __set, __autoload와 같은 마법을 피해라.

7. require_once() is expensive
require_once()는 비싸다.

8. Use full paths in includes and requires, less time spent on resolving the OS paths.
include와 require를 사용할 때, 경로를 찾는데 시간이 적게 걸리는 full path를 사용하라.

9. If you need to find out the time when the script started executing, $_SERVER[’REQUEST_TIME’] is preferred to time()
스크립트가 언제 실행했는지 알고 싶으면 time()보다 $_SERVER[’REQUEST_TIME’]이 좋다.

10. See if you can use strncasecmp, strpbrk and stripos instead of regex
정규표현식보다는 가능하면 strncasecmp나 strpbrk, stripos를 사용하라.
* 역주
strncasecmp: 두 문자열의 앞쪽 일부가 대소문자 구분없이 일치하는지 확인할 때 사용
strpbrk: 문자 집합에 속한 특정 문자가 문자열에 나타나는지 확인할 때 사용
stripos: 대소문자 구분없이 특정 문자열이 다른 문자열에 포함되는지 확인할 때 사용

11. str_replace is faster than preg_replace, but strtr is faster than str_replace by a factor of 4
str_replace가 preg_replace보다 빠르지만, strtr은 str_replace보다 4배 빠르다.

12. If the function, such as string replacement function, accepts both arrays and single characters as arguments, and if your argument list is not too long, consider writing a few redundant replacement statements, passing one character at a time, instead of one line of code that accepts arrays as search and replace arguments.
만약 문자열 교체 같은 함수가 배열과 문자열을 인자로 받아들이면, 그리고 그 인자 리스트가 길지 않다면, 배열을 한 번에 받아들여서 처리하는 것 대신에 한 번에 문자열을 하나씩 넘겨서 처리하는 것을 고려해봐라.

13. It’s better to use select statements than multi if, else if, statements.
여러 개의 if/else if 문장 대신에 select 문장을 사용하는 게 더 좋다.

14. Error suppression with @ is very slow.
@를 이용한 에러 출력 방지는 매우 느리다.

15. Turn on apache’s mod_deflate
Apache의 mod_deflate를 켜라.
*역주
mod_deflate는 서버의 출력을 클라이언트에게 보내기 전에 압축하는 모듈임

16. Close your database connections when you’re done with them
DB를 다 사용했으면 연결을 닫아라.

17. $row[’id’] is 7 times faster than $row[id]
$row[’id’]가 $row[id]보다 7배 빠르다.

18. Error messages are expensive
에러 메시지는 비싸다.

19. Do not use functions inside of for loop, such as for ($x=0; $x < count($array); $x) The count() function gets called each time.
for 루프의 표현식 안에서 함수를 사용하지 마라.
for ($x = 0; $x < count($array); $x)에서 count() 함수가 매번 호출된다.

20. Incrementing a local variable in a method is the fastest. Nearly the same as calling a local variable in a function.
메쏘드 안에서 지역 변수를 증가시키는 것이 거의 함수 안에서 지역 변수를 호출(증가?)하는 것만큼 빠르다.

21. Incrementing a global variable is 2 times slow than a local var.
전역 변수를 증가시키는 것이 지역 변수를 증가시키는 것보다 2배 느리다.

22. Incrementing an object property (eg. $this->prop++) is 3 times slower than a local variable.
객체의 멤버변수를 증가시키는 것이 지역 변수를 증가시키는 것보다 3배 느리다.

23. Incrementing an undefined local variable is 9-10 times slower than a pre-initialized one.
값이 지정되지 않은 지역 변수를 증가시키는 것이 미리 초기화된 변수를 증가시키는 것보다 9~10배 느리다.

24. Just declaring a global variable without using it in a function also slows things down (by about the same amount as incrementing a local var). PHP probably does a check to see if the global exists.
전역 변수를 함수 안에서 사용하지 않으면서 그저 선언하기만 해도 (지역 변수를 증가시키는 것만큼) 느려진다. PHP는 아마 전역 변수가 존재하는지 알기 위해 검사를 하는 것 같다.

25. Method invocation appears to be independent of the number of methods defined in the class because I added 10 more methods to the test class (before and after the test method) with no change in performance.
메쏘드 호출은 클래스 안에서 정의된 메쏘드의 갯수에 독립적인 듯 하다. 왜냐하면 10개의 메쏘드를 테스트 클래스에 추가해봤으나 성능에 변화가 없었기 때문이다.

26. Methods in derived classes run faster than ones defined in the base class.
파생된 클래스의 메쏘드가 베이스 클래스에서 정의된 것보다 더 빠르게 동작한다.

27. A function call with one parameter and an empty function body takes about the same time as doing 7-8 $localvar++ operations. A similar method call is of course about 15 $localvar++ operations.
한 개의 매개변수를 가지고 함수를 호출하고 함수 바디가 비어있다면(함수 내부에서 아무것도 실행하지 않는다면) 그것은 7~8개의 지역변수를 증가시키는 것과 똑같은 시간을 차지한다. 비슷한 메쏘드 호출은 마찬가지로 15개의 지역변수를 증가시키는 연산쯤 된다.

28. Surrounding your string by ‘ instead of ” will make things interpret a little faster since php looks for variables inside “…” but not inside ‘…’. Of course you can only do this when you don’t need to have variables in the string.
문자열을 이중 따옴표 대신에 단일 따옴표로 둘러싸는 것은 좀 더 빠르게 해석되도록 한다. 왜냐하면 PHP가 이중 따옴표 안의 변수를 찾아보지만 단일 따옴표 안에서는 변수를 찾지 않기 때문이다. 물론 문자열 안에서 변수를 가질 필요가 없을 때만 이렇게 사용할 수 있다.

29. When echoing strings it’s faster to separate them by comma instead of dot. Note: This only works with echo, which is a function that can take several strings as arguments.
문자열을 echo할 때 마침표 대신에 쉼표로 분리하는 것이 더 빠르다.
주의: 이것은 여러 문자열을 인자로 받아들이는 함수인 echo로만 작동한다.

30. A PHP script will be served at least 2-10 times slower than a static HTML page by Apache. Try to use more static HTML pages and fewer scripts.
Apache에 의해 PHP 스크립트는 정적 HTML 페이지보다 최소 2에서 10배 느리게 서비스된다. 더 많은 정적 HTML 페이지와 더 적은 스크립트를 사용하려고 노력하라.

31. Your PHP scripts are recompiled every time unless the scripts are cached. Install a PHP caching product to typically increase performance by 25-100% by removing compile times.
PHP 스크립트는 캐시되지 않으면 매번 재 컴파일된다. 컴파일 시간을 제거함으로써 25~100%만큼의 성능을 증가시키기 위해 PHP 캐싱 도구를 설치하라.

32. Cache as much as possible. Use memcached – memcached is a high-performance memory object caching system intended to speed up dynamic web applications by alleviating database load. OP code caches are useful so that your script does not have to be compiled on every request
가능한 한 많이 캐시하라. memcached를 사용하라. memcached는 고성능 메모리 객체 캐싱 시스템이다.

33. When working with strings and you need to check that the string is either of a certain length you’d understandably would want to use the strlen() function. This function is pretty quick since it’s operation does not perform any calculation but merely return the already known length of a string available in the zval structure (internal C struct used to store variables in PHP). However because strlen() is a function it is still somewhat slow because the function call requires several operations such as lowercase & hashtable lookup followed by the execution of said function. In some instance you can improve the speed of your code by using an isset() trick.
문자열을 가지고 작업하며 문자열이 특정 길이인지 확인할 필요가 있을 때, strlen() 함수를 쓸 것이다. 이 함수는 계산없이 zval 구조체에서 사용할 수 있는 이미 알려진 문자열 길이를 반환하기 때문에 매우 빠르다. 그러나 strlen()이 함수이기 때문에 여전히 조금 느리다. 왜냐하면 함수 호출은 언급된 함수의 실행 뒤에 lowercase와 hashtable lookup같은 여러 개의 연산을 호출하기 때문이다. 어떤 경우에는 isset() 트릭을 이용하여 코드의 스피드를 증가시킬 수도 있다.

Ex.
if (strlen($foo) < 5) { echo “Foo is too short”; }
vs.
if (!isset($foo{5})) { echo “Foo is too short”; }

Calling isset() happens to be faster then strlen() because unlike strlen(), isset() is a language construct and not a function meaning that it’s execution does not require function lookups and lowercase. This means you have virtually no overhead on top of the actual code that determines the string’s length.
isset()을 호출하는 것은 strlen()과는 달리 isset()이 언어 기본문법이고 함수가 아니기 때문에 함수 찾와 lowercase 작업을 필요로 하지 않으므로 strlen()보다 더 빠를 수도 있다. 이것은 가상적으로 문자열의 길이를 결정하는 실제 코드에 과부하가 없다는 것을 의미한다.

34. When incrementing or decrementing the value of the variable $i++ happens to be a tad slower then ++$i. This is something PHP specific and does not apply to other languages, so don’t go modifying your C or Java code thinking it’ll suddenly become faster, it won’t. ++$i happens to be faster in PHP because instead of 4 opcodes used for $i++ you only need 3. Post incrementation actually causes in the creation of a temporary var that is then incremented. While pre-incrementation increases the original value directly. This is one of the optimization that opcode optimized like Zend’s PHP optimizer. It is a still a good idea to keep in mind since not all opcode optimizers perform this optimization and there are plenty of ISPs and servers running without an opcode optimizer.
변수 $i의 값을 증가시키거나 감소키킬 때, $i++은 ++$i보다 조금 더 느릴 수 있다. 이것은 PHP의 특징이고 다른 언어에는 해당되지 않으니 좀 더 빨라질 것을 기대하면서 C나 Java 코드를 바꾸러 가지 마라. 안 빨라질 것이다. ++$i는 PHP에서 좀 더 빠른데 그것은 $i++에 4개의 opcode가 사용되는 대신에 3개만 필요하기 때문이다. 후증가는 사실 증가될 임시변수의 생성을 초래한다. 반면에 전증가는 원래 값을 직접 증가시킨다. 이것은 opcode가 Zend의 PHP optimizer처럼 최적화하는 최적화 기법의 하나이다. 모든 opcode optimizer들이 이 최적화를 수행하는 것은 아니고 많은 ISP와 server들이 opcode optimizer없이 수행되고 있기 때문에 명심하는 게 좋을 것이다.

35. Not everything has to be OOP, often it is too much overhead, each method and object call consumes a lot of memory.
모든 것이 OOP일 필요는 없다. 종종 그것은 너무 많은 과부하가 된다. 각각의 메쏘드와 객체 호출은 메모리를 많이 소비한다.

36. Do not implement every data structure as a class, arrays are useful, too
모든 데이터 구조를 클래스로 구현하지 마라. 배열도 유용하다.

37. Don’t split methods too much, think, which code you will really re-use
메쏘드를 너무 많이 분리하지 마라. 어떤 코드를 정말 재사용할지 생각해봐라.

38. You can always split the code of a method later, when needed
항상 메쏘드의 코드를 나중에 필요할 때 분리할 수 있다.

39. Make use of the countless predefined functions
수많은 미리 정의된 함수를 활용해라.

40. If you have very time consuming functions in your code, consider writing them as C extensions
매우 시간을 소비하는 함수가 있다면, C 확장으로 작성하는 것을 고려해봐라.

41. Profile your code. A profiler shows you, which parts of your code consumes how many time. The Xdebug debugger already contains a profiler. Profiling shows you the bottlenecks in overview
당신의 코드를 프로파일해봐라. 프로파일러는 코드의 어떤 부분이 가장 많은 시간을 소비하는지 보여준다. Xdebug 디버거는 이미 프로파일러를 포함하고 있다. 프로파일링은 전체적인 병목을 보여준다.

42. mod_gzip which is available as an Apache module compresses your data on the fly and can reduce the data to transfer up to 80%
Apache 모듈로 사용가능한 mod_gzip은 실행 중에 데이터를 압축하여 전송할 데이터를 80%까지 줄일 수 있다.

43. Excellent Article about optimizing php by John Lim

centos7 네트워크 트래픽 설정 / 퍼옴

How to Install vnStat and vnStati to Monitor Network Traffic in RHEL/CentOS 7

from http://www.tecmint.com/install-vnstat-and-vnstati-to-monitor-linux-network-traffic/

Centos7 php5.6버전설치하기

PHP 5.6 on CentOS/RHEL 7.2 and 6.7 via Yum

PHP 5.6.19 has been released on PHP.net on 3rd March 2016, and is also available for CentOS/RHEL 6.7 and 7.2 at Webtatic via Yum.

Update 2015-08-22 – Webtatic now has released PHP 7 RC1 for CentOS/RHEL 6 and 7

PHP 5.6 adds new features such as:

  • constant scalar expressions
  • variadic functions
  • argument unpacking
  • exponentiation operator
  • support for large(>2GiB) file uploads
  • SSL/TLS improvements including peer verification by default
  • a new command line debugger called phpdbg

To see what else has been added, check out the Migrating from PHP 5.5.x to PHP 5.6.x.

To install, first you must add the Webtatic EL yum repository information corresponding to your CentOS/RHEL version to yum:

CentOS/RHEL 7.x:

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

CentOS/RHEL 6.x:

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm

Now you can install PHP 5.6’s mod_php SAPI (along with an opcode cache) by doing:

yum install php56w php56w-opcache

You can alternatively install PHP 5.6’s php-fpm SAPI (along with an opcode cache by doing:

yum install php56w-fpm php56w-opcache

See the package list below for additional SAPIs and PHP extensions.

If you would like to upgrade php to this version it is recommended that you first check that your system will support the upgrade, e.g. making sure any CPanel-like software can run after the upgrade.

Unless you know what you are doing, it is risky upgrading an existing system. It’s much safer to do this by provisioning a separate server to perform the upgrade as a fresh install instead.

If you know what you are doing, you can upgrade PHP by:

yum install yum-plugin-replace
 
yum replace php-common --replace-with=php56w-common

It will likely give you a message “WARNING: Unable to resolve all providers …”. This is normal, and you can continue by tying “y“. You will be given a chance to see what packages will be installed and removed before again being given a chance to confirm.

SAPIs – different runtime environments of PHP

mod_php NTS
(non-thread safety) Contained in the php56w package, this SAPI integrates into Apache Httpd (2.2.* on RHEL/CentOS 6, 2.4.* on RHEL/CentOS 7). It is the standard SAPI for use with httpd prefork mpm (the default mode httpd is ran under. It is not thread-safe, but doesn’t need to be due to prefork not using threads. It’s located at /usr/lib[64]/httpd/modules/libphp5.so
cli
Contained in the php56w-cli package, this SAPI allows running scripts from the command-line, and also has a built-in web server for development-use. Located at /usr/bin/php
fpm
Contained in the php56w-fpm package, fpm (FastCGI Process Manager) is a scalable FastCGI process, which acts similar to how Httpd prefork mpm works managing it’s forks. Located at /usr/sbin/php-fpm, it is controlled using the /etc/init.d/php-fpm service script
phpdbg
Contained in the php56w-phpdbg package, phpdbg has the ability to debug scripts using breakpoints from the command-line, and also supports remote-debugging using an external Java client for remote communication.
embedded
Contained in the php56w-embedded package, this SAPI allows embedding PHP in other applications. It’s library is located at /usr/lib[64]/libphp5.so
cgi, fastcgi
Contained in the php56w-cli package, these SAPIs are not recommended for use, but are available where needed. They both exist in the binary at /usr/bin/php-cgi.
mod_php TS
(thread safety) Contained in the php56w package, this SAPI integrates into Apache Httpd (2.2.* on RHEL/CentOS 6, 2.4.* on RHEL/CentOS 7). It is the standard SAPI for use with httpd worker mpm. It’s supposed to be thread-safe, but can’t guarantee to be, and certainly not under additional PHP extensions. It’s better to use FastCGI SAPIs than this one. It’s located at /usr/lib[64]/httpd/modules/libphp5-zts.so

Packages

Package Provides
php56w mod_php, php56w-zts
php56w-bcmath
php56w-cli php-cgi, php-pcntl, php-readline
php56w-common php-api, php-bz2, php-calendar, php-ctype, php-curl, php-date, php-ereg, php-exif, php-fileinfo, php-filter, php-ftp, php-gettext, php-gmp, php-hash, php-iconv, php-json, php-libxml, php-openssl, php-pcre, php-pecl-Fileinfo, php-pecl-phar, php-pecl-zip, php-reflection, php-session, php-shmop, php-simplexml, php-sockets, php-spl, php-tokenizer, php-zend-abi, php-zip, php-zlib
php56w-dba
php56w-devel
php56w-embedded php-embedded-devel
php56w-enchant
php56w-fpm
php56w-gd
php56w-imap
php56w-interbase php_database, php-firebird
php56w-intl
php56w-ldap
php56w-mbstring
php56w-mcrypt
php56w-mssql
php56w-mysql php-mysqli, php_database
php56w-mysqlnd php-mysqli, php_database
php56w-odbc php-pdo_odbc, php_database
php56w-opcache php56w-pecl-zendopcache
php56w-pdo
php56w-pear
php56w-pecl-apcu
php56w-pecl-gearman
php56w-pecl-geoip
php56w-pecl-imagick
php56w-pecl-memcache
php56w-pecl-xdebug
php56w-pgsql php-pdo_pgsql, php_database
php56w-phpdbg
php56w-process php-posix, php-sysvmsg, php-sysvsem, php-sysvshm
php56w-pspell
php56w-recode
php56w-snmp
php56w-soap
php56w-tidy
php56w-xml php-dom, php-domxml, php-wddx, php-xsl
php56w-xmlrpc

Opcode Caches

The PHP distribution now comes with an opcode cache. This is the Zend Optimizer+ opcode cache, now known as the Zend OPcache extension. This extension is optional, so does not preclude you from using an alternate one.

Due to it being included in the PHP source distribution, it will be well maintained and more suitable for use while other Opcode cache’s are being updated over the coming months.

yum install php56w-opcache

error_reporting E_ALL now includes E_STRICT

As mentioned in the PHP 5.4 guide:

You may get a lot more errors coming out of your error logs if by default your error_reporting is set to E_ALL now without explicitly turning off E_STRICT. The default php.ini that comes with the PHP package turns this off by default, but if you are upgrading from an existing installation, your php.ini may not be updated, meaning this will likely be turned on.

Centos 7 SendMail 설치

Sendmail is a MTA (Mail Transfer Agent) server used for transferring email from between different hosts. Sendmail uses SMTP (Simple Mail Transfer Protocol) protocol. Most of system administrators preferred to use Sendmail server as MTA than other MTAs.

RHEL 5 or its earlier versions were using Sendmail as default mail server, But newer version’s of RHEL based systems adapted postfix as default mail server. Most of users are familiar with Sendmail and want to use it with version 6 also. This article will help that users for installing Sendmail server on RHEL 7/6/5 or with minimal configuration.

팩키지를 설치하기 위한 준비

If you don’t have installed Sendmail using following command to install Sendmail with other required packages using yum package manager.

# yum install sendmail sendmail-cf m4

SendMail 설정

Before starting configuration we must know about various Sendmail configuration files exists in /etc/mail directory.

  • access — Allow/Deny other systems to use Sendmail for outbound emails.
  • domaintable — Used for domain name mapping for Sendmail.
  • local-host-names — Used to define aliases for the host.
  • mailertable — Defined the instructions that override routing for particular domains.
  • virtusertable — Specifies a domain-specific form of aliasing, allowing multiple virtual domains to be hosted on one machine.

 

2.1 Comment out below line in /etc/mail/sendmail.mc to allow receiving email from anywhere. To comment a line in sendmail.mc, just put dnl at start of line.

dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

2.2 Add this line also in sendmail.mc above ‘MAILER’ option

FEATURE(`relay_hosts_only')dnl

2.3 Add your PC’s full hostname in this file.

# hostname >> /etc/mail/relay-domains

Recompile Sendmail Configuration

m4 ia a macro processor to compile the Sendmail configuration files. m4 is stream-based, that is, it doesn’t understand about lines.

# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

Restart Sendmail service

# /etc/init.d/sendmail restart

Configure Domain based E-mail Routing

As we read above that virtusertable file used for aliasing, allowing multiple virtual domains to be hosted on one machine.

1. All emails addressed to @example.com domain delivered to support@mydomain.com

@example.com support@mydomain.com

2. All emails addressed to support@mydomain.com will forward to local user jack.

support@mydomain.com  jack

3. All emails addressed to @mydomain.com will forward to domain @otherdomain.com with corresponding usernames.

@mydomain.com    %1@otherdomain.com

4. All emails addressed to @otherdomain.com will be rejected my mail server with acknowledging sender with message

@otherdomain.com 	 error:nouser User unknown

After making all changes in virtusertable execute following command to create updated virtusertable.db file containing the new configuration.

# makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable

Now restart Sendmail service

# /etc/init.d/sendmail restart

Thanks for reading this article. I hope this article will help you to configure Sendmail on CentOS and Red Hat systems..

References:
http://www.sendmail.com/
http://www.sendmail.com/sm/open_source/docs/m4/intro_m4.html

 

This post is  from http://tecadmin.net/install-sendmail-server-on-centos-rhel-server/